在 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 文件夹来创建列表。某些帐户可能被隐藏,其用户文件夹位于其他地方,而我不希望GuestShared文件夹出现在列表中。这里的问题是,我甚至不知道从哪里开始。

答案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-preadcase

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

相关内容