Bash-在选择一个选项后在选择菜单选项上迭代?

Bash-在选择一个选项后在选择菜单选项上迭代?,bash,Bash,我正在阅读Bash中的选择菜单: 我很困惑,当涉及到迭代菜单中的选项,并将感谢任何反馈 使用此处的代码作为起点: 我们得到以下输出: root@dev:~/# ./test.sh 1) Option 1 2) Option 2 3) Option 3 4) Quit Please enter your choice: 1 you chose choice 1 Please enter your choice: 2 you chose choice 2 Please enter your ch

我正在阅读Bash中的选择菜单:

我很困惑,当涉及到迭代菜单中的选项,并将感谢任何反馈

使用此处的代码作为起点:

我们得到以下输出:

root@dev:~/# ./test.sh
1) Option 1
2) Option 2
3) Option 3
4) Quit
Please enter your choice: 1
you chose choice 1
Please enter your choice: 2
you chose choice 2
Please enter your choice: 4
root@dev:~/#
我想尝试做的是,在选择一个选项后再次显示选择选项,因此输出如下:

root@dev:~/# ./example.sh
1) Option 1
2) Option 2
3) Quit
Please enter your choice: 1
you chose choice 1
1) Option 1
2) Option 2
3) Quit
Please enter your choice: 2
you chose choice 2
1) Option 1
2) Option 2
3) Quit
Please enter your choice: 3
root@dev:~/#
因此,我给出了一个Bash(L),并尝试循环使用选项(数组?):

但我得到的结果如下:

root@dev:~/# ./stumped.sh
1) Option 1
2) Quit
Please enter your choice: 1
you chose choice 1
1) Option
2) 1
3) Quit
Please enter your choice:
看起来数组值是用空格分隔的

据我所知:
options=(“Option 1”“Quit”)
正在创建一个由2个值而不是3个值组成的数组,但是在Bash中它被解释为3,我不知道为什么


有人能告诉我为什么会发生这种情况吗?

让我们创建一个
函数,显示菜单并响应用户的选择:

function show_menu {
  select option in "${OPTIONS[@]}"; do
    echo $option
    break
  done
}
现在,我们可以将
函数
封装在一个循环中,并且只有在用户选择了
退出
时才会中断:

while true; do
  option=$(show_menu)

  if [[ $option == "Quit" ]]; then
    break
  fi
done

当您希望在每次迭代中显示编号的选项时,请选择“为您这样做”

options=("Option one" "two"  three "and number four"  quit)
while true; do
   select item in "${options[@]}" ; do
      if [ -n "${item}" ]; then
         break
      fi
      echo "Sorry, please enter a number as shown."
      break
   done;
   if [[ "${item}" = "quit" ]]; then
     break
   fi
   if [ -n "${item}" ]; then
      echo "Your answer is ${item}"
   fi
done

您应该创建一个弹出菜单的
函数
,然后使用内部的
函数创建一个
while
循环。目前,您的代码从不循环(它没有重复构造,例如
for
while
,等等),您没有在内部循环中引用
${options[@]}
。@slezica更新了我问题中的最后一个代码块,这是一个打字错误。它不会像我预期的那样循环?@choroba每个选项都变成$option,我在内部循环中引用了它?代码有点复杂。循环应该在外部(毕竟,您正在重复该操作)。我建议写一篇可能的文章,我可能需要很长时间才能理解你在这里做了什么,但谢谢。尽管如此,这并不是我问题的答案,尽管这可能是一个更好的解决方案。我承认这确实很有效。。。感谢您提供的有趣示例:)
options=("Option one" "two"  three "and number four"  quit)
while true; do
   select item in "${options[@]}" ; do
      if [ -n "${item}" ]; then
         break
      fi
      echo "Sorry, please enter a number as shown."
      break
   done;
   if [[ "${item}" = "quit" ]]; then
     break
   fi
   if [ -n "${item}" ]; then
      echo "Your answer is ${item}"
   fi
done