OS XのBashでユーザーの選択リストを作成する

OS XのBashでユーザーの選択リストを作成する

私は、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選択部分をインデントし、\nCRLF を送信します。

メニュー オプションが印刷されると、readコマンドはユーザーに入力を要求し、その選択を変数 に設定します。のオプション内で変数をCHOICE再利用して、有効な選択肢を表示できます。入力を検証するには、追加のコードを追加する必要があります。これは、簡単なステートメントで実行できます。count-preadcase

case $choice in 
  1) #some code
     ;;
  2) #some code
     ;;
  *) echo "Invalid choice"
     ;;
esac

関連情報