Я пытаюсь удалить старые учетные записи пользователей сети с нашего лабораторного сервера (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 ответ1

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .