Создайте список избранных пользователей в Bash на OS X

Создайте список избранных пользователей в Bash на OS X

Я пытаюсь создать скрипт копирования для быстрого копирования папки пользователя в 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

Связанный контент