私は、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