Я пытаюсь создать скрипт копирования для быстрого копирования папки пользователя в OS X, исключая при этом весь мусор (кэши, старые резервные копии iPhone, журналы и т. д.). Что касается копирования этих файлов/папок, то у меня нет проблем. Проблема заключается в выборе пользователя. Я хочу создать список всех пользователей на компьютере, исключая системные учетные записи, и позволить оператору выбирать, какую папку пользователя следует резервировать, просто введя номер из списка. В настоящее время я могу получить пользователей с помощью следующей команды:
userList=`dscl . list /Users UniqueID | awk '$2 >= 400 { print $1; }'`
Например, это вернет:
hiddenadmin fred joe kim
Я хотел бы создать список выбора, который затем покажет:
Please choose which user folder you would like to copy:
1) hiddenadmin
2) fred
3) joe
4) kim
Как только у меня есть пользователь, все в порядке, но я не могу заставить список создаться. Кроме того, нет гарантии, что имена будут такими же, или даже количество пользователей будет таким же.
Если вам интересно, почему я просто не заглядываю в папку /Users, чтобы создать список. Некоторые учетные записи могут быть скрыты и иметь свою папку пользователя в другом месте, и я не хочу, чтобы папки Guest
или Shared
были в списке. Проблема в том, что я даже не знаю, с чего начать.
решение1
Естьмногоспособов сделать то, о чем вы просите. Вот мой быстрый и грязный взгляд.
Поскольку у вас уже есть ваши пользователи в переменной, вам просто нужен цикл for
для форматирования. Я буду использовать ваши значения для своего примера:T
userList="hiddenadmin fred joe kim"
echo "Please choose which user folder you would like to copy:"
count=0
for name in $userList;do
count=$((count+1))
printf '\t%s) %s\n' $count $name
echo
done
read -p "Choose from $(eval echo {1..$count}): " CHOICE
Этот цикл прочитает ваш userList
, инициализирует счетчик и использует printf
для вывода. Он \t
сделает отступ для вашего выбора и \n
отправит CRLF.
После того, как ваш пункт меню будет напечатан, read
команда предложит пользователю ввести данные и установит его выбор в переменную CHOICE
. Вы можете повторно использовать count
переменную в -p
опции для read
отображения допустимых вариантов. Вам придется добавить дополнительный код для проверки ввода. Это можно сделать с помощью простого case
оператора.
case $choice in
1) #some code
;;
2) #some code
;;
*) echo "Invalid choice"
;;
esac