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

时间:2016-03-07 21:40:53

标签: bash

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

Making menus with the select built-in

在迭代菜单中的选项时我很困惑,并希望得到任何反馈。

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

How can I create a select menu in a shell script?

我们得到以下输出:

#!/bin/sh
git --work-tree=/var/www/domain.com --git-dir=/var/repo/site.git checkout -f

我想尝试做的是,一旦选择了一个选项,再次显示选择选项,因此输出将如下:

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:~/#

所以我给了它一个Bash(L)并尝试循环选项(数组?):

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:~/#

但后来我得到了一个输出:

#!/bin/bash

PS3='Please enter your choice: '
options=("Option 1" "Quit")
select opt in "${options[@]}"
do
  case $opt in
    "Option 1")
      echo "you chose choice 1"
      # Create an incrementing value
      loop=1;
      # Loop through each option
      for option in ${options[@]} ; do
        # Echo the option
        echo "$loop) $option";
        # Increment the loop
        loop=$((loop+1));
      done
      ;;
    "Quit")
      break
      ;;
    *) echo invalid option;;
  esac
done

所以看起来这里的数组值是用空格分隔的吗?

根据我的理解: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: 正在创建一个包含2个值而不是3个值的数组,但它在Bash中被解释为3并且我不确定原因。

有人可以启发并解释为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

让我们创建一个显示菜单的function并回应用户的选择:

function show_menu {
  select option in "${OPTIONS[@]}"; do
    echo $option
    break
  done
}

现在,我们可以将function包装在一个循环中,并且只有在用户选择Quit时才会中断:

while true; do
  option=$(show_menu)

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

瞧!

答案 1 :(得分:0)

如果希望每次迭代显示编号选项,请选择为您执行此操作。

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