我正在嘗試建立一個複製腳本來快速複製 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