我正在尝试从我们的实验室服务器 (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)