为什么我的菜单选择第一次失败?

时间:2016-02-08 17:04:05

标签: bash menu

我尝试使用内置的select语句使用简单的菜单回答another SO question。代码显示来自/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/3220113https://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

1 个答案:

答案 0 :(得分:2)

只有在以交互方式键入命令时才会出现此问题,而不是在脚本中。原因是您在select行之后键入的行被用作对提示的响应。由于if不在菜单中,因此会报告错误。然后它不执行if命令,因为它被读作对提示的响应。

这不是脚本中的问题,因为脚本中的命令不用作标准输入。