Команда оболочки для удаления старых сетевых пользователей на 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
Когда я запускаю эту команду как исполняемый файл оболочки или просто прямо в командной строке, она проходит по $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".
Мне нужно выяснить, как сделать массив результатов из команды find для прохождения цикла. Я думаю, я просто не понимаю, как массивы и строки обрабатываются в bash. Какие-нибудь мысли?
1 ответ
Вы вложили свой find
команда в USERLIST
назначение в одинарных кавычках - это назначит всю команду в виде строки для $USERLIST
переменная (исключая все расширения оболочки - для этого нужны одинарные кавычки). Вместо этого, чтобы получить назначенный вывод команды, вам нужно заключить его в обратные кавычки (`) или в $(<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)