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

标签 bash menu

我试图回答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/

相关文章:

css - 在 Ipad 上来回悬停菜单问题

css - IE 7,8 中不显示水平菜单背景

linux - "Syntax error near unexpected token ` crontab '"当尝试在一行中添加 cron 作业作为 sudo 时

bash - 在 bash 变量中转义点

linux - 初学者的 Bash 脚本 : "Unary Operator Expected" error && how to use grep to search for a variable from the output of a command?

bash、sed : replacing pattern with multiline file content

json - 无法在命令行中解码 json 字符串

html - 我将如何使这个导航栏下拉?

html - 菜单栏不拉伸(stretch)单元格的全长

html - 粘性导航和移动响应