Shell 命令删除 Mac OS X Server 上的旧网络用户

Shell 命令删除 Mac OS X Server 上的旧网络用户

我正在尝试从我们的实验室服务器 (Mac OS X 10.6) 中删除旧的网络用户帐户。我找到了一个简单的命令行命令来查找一年多未访问的用户目录:

find /Volumes/Server-HD2/NetworkUsers/Students -type d -maxdepth 1 -mindepth 1 -not -name "." -mtime +356

运行此命令成功列出所有旧帐户。然后我发现一个看似简单的 for 循环,但它不起作用:

#!/bin/bash

keep1="/Volumes/Server-HD2/NetworkUsers/Students/studenttest"
keep2="/Volumes/Server-HD2/NetworkUsers/Students/studenttest2"

USERLIST='find /Volumes/Server-HD2/NetworkUsers/Students -type d -maxdepth 1 -mindepth 1 -not -name "." -mtime +356'

for a in $USERLIST ; do
  [[ "$a" == "$keep1" ]] && continue                    #skip account 1
  [[ "$a" == "$keep2" ]] && continue                    #skip account 2
  echo "Deleting account and home directory for" $a
  dscl . delete $a                                      #delete the account
  rm -r $a                                              #delete the home directory
done

当我将此命令作为可执行 shell 文件或直接在命令行中运行时,它会循环遍历 $a 作为 $USERLIST 中的每个单词。在其他情况下,如果我简单地这样做:

USERLIST='find /Volumes/Server-HD2/NetworkUsers/Students -type d -maxdepth 1 -mindepth 1 -not -name "." -mtime +356'

for a in $USERLIST ; do 
   echo $a
done

它将返回:

find
/Volumes/Server-HD2/NetworkUsers/Students
-type
d
-maxdepth
1
-mindepth
1
...

而我希望它返回符合“查找”命令的每个目录。

我需要弄清楚如何创建一个数组,其中包含 find 命令的结果以供循环。我想我只是不明白 bash 中如何处理数组和字符串。有什么想法吗?

答案1

您已将find命令括USERLIST在单引号中,这将分配整个命令作为字符串$USERLIST变量(放弃所有 shell 扩展——这是单引号的用途)。相反,要获得分配的命令输出,您需要将其括在反引号(`)或构造中$(<command>),即

USERLIST=`find /Volumes/Server-HD2/NetworkUsers/Students -type d -maxdepth 1 -mindepth 1 -not -name "." -mtime +356`

或者

USERLIST=$(find /Volumes/Server-HD2/NetworkUsers/Students -type d -maxdepth 1 -mindepth 1 -not -name "." -mtime +356)

相关内容