我试图回答another SO question使用内置 select 语句的简单菜单。该代码显示 /etc/passwd
中的名称,并让您通过给出数字来选择名称:
PS3="Enter a number: "
select name in $(cut -d: -f1 /etc/passwd) ; do
if [ -n "${name}" ]; then
break
fi
echo "Sorry, please enter a number as shown."
done
echo "Entry from passwd is: ${name}"
除了第一次之外,一切都很好。当您第一次给出正确答案时,它会要求您重试。
我第一次尝试获得更详细的解释,但找不到可复制的 cooking 书。当您将此代码复制粘贴到您的服务器上并给出正确答案时,您可能会遇到同样的问题。当您重复该命令(来自历史记录或新粘贴)时,代码现在显示问题。我尝试通过注销并登录(有时有效)或重新启动来再次遇到问题。
我尝试了不同的方法在其他情况下重现该问题(使用不同的变量名称、取消设置变量、使用带有 select name in $(echo One; sleep 1; echo Two; sleep 2; echo Three; 的缓慢值列表) sleep 1);
并打开一个新的 shell。
我使用 select
搜索了其他示例,但在其他帖子(如 https://stackoverflow.com/a/16750755/3220113)中找不到线索。和 https://askubuntu.com/a/1716 。
我尝试使用同步修复我的代码,这似乎是一个解决方法:
PS3="Enter a number: "
select name in $(cut -d: -f1 /etc/passwd) ; do
# is sync needed here?
sync
if [ -n "${name}" ]; then
break
fi
echo "Sorry, please enter a number as shown."
done
echo "Entry from passwd is: ${name}"
当我包含同步命令时,我无法重现该错误。同步真的是一个有效的补丁吗?为什么我需要这个?
我不需要其他方式来编写菜单。我已经找到图形对话框 Dialog from bash script并正在寻找一个简单的替代品来代替我自己的过于复杂的https://unix.stackexchange.com/a/115371/57293 .
最佳答案
仅当您以交互方式键入命令(而不是在脚本中)时才会出现此问题。原因是您在 select
行之后键入的行被用作对提示的响应。由于 if
不在菜单中,因此会报告错误。然后它不会执行 if
命令,因为它被读取为对提示的响应。
这在脚本中不是问题,因为脚本中的命令不用作标准输入。
关于bash - 为什么我的菜单第一次选择失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35275192/