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

0

Есть много способов сделать то, что вы просите. Вот мой быстрый и грязный дубль.

Поскольку у вас уже есть пользователи в переменной, вам просто необходим цикл 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

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