我试图使用内置的select语句通过一个简单的菜单回答另一个SO问题。该代码显示中的名称/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}"
除第一次外,其他都工作正常。第一次给出正确答案时,它将要求您重试。
我试图第一次获得更详细的解释,但无法获得可复制的烹饪书。当您将此代码复制粘贴到服务器上并给出正确答案时,您可能会遇到相同的问题。当您重复命令(从历史记录或新粘贴的命令)时,代码现在显示问题。我试图通过注销并登录(有时可以正常工作)或重新启动来再次解决该问题。
我尝试了其他方法来在其他情况下重现该问题(使用不同的变量名称,未设置变量,使用慢速值列表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}"
包含sync命令时,无法重现该错误。同步真的是一个有效的补丁程序,为什么我在这里需要它?
我不需要其他方式来编写菜单。我已经从bash脚本中找到了图形对话框Dialog,并且正在寻找简单替换我自己过于复杂的https://unix.stackexchange.com/a/115371/57293的方法。
仅当您以交互方式而不是在脚本中键入命令时,才会出现此问题。原因是您在该select
行之后键入的行被用作对提示的响应。由于if
不在菜单中,因此会报告错误。然后它不执行if
命令,因为它被读取为对提示的响应。
在脚本中这不是问题,因为脚本中的命令未用作标准输入。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句