从bash case语句中获取通配符值

时间:2016-01-30 05:37:24

标签: bash case-statement

我想知道如何从案例通配符中获取值?我有一个为我生成菜单的数组。然后,我有一个案例,确定选择哪个选项。 case语句的最后一部分是通配符值。我希望得到用于通配符的值。

以下是我正在使用的代码:

menu=()
menu+=('Option 1')
menu+=('Option 2')
menu+=('Option 3')
menu+=('Option 4')
menu+=('Quit')

echo "What would you like to install?"
echo " "
select opt in "${menu[@]}"
do
    case $opt in
        'Option 1' )
            echo "Doing Option 1"
            ;;
        'Option 2' )
            echo "Doing Option 2"
            ;;
        'Option 3' )
            echo "Doing Option 3"
            ;;
        'Option 4' )
            echo "Doing Option 4"
            ;;
        'Quit' )
            echo "Quitting installations"
            exit;
            ;;
        * )
            echo "Invalid input: ${opt}"
            ;;
    esac
done

在上面,"无效输入"值始终为空。我可以进入" foobar"作为选项,它没有显示。我还将变量更改为$opt,但它仍然无法打印出来。

1 个答案:

答案 0 :(得分:4)

来自man bash

  

select name [ in word ] ; do list ; done

     

展开后面的单词列表,生成项目列表。扩展单词集打印在标准错误上,每个单词前面都有一个数字。如果省略in字,则打印位置参数(参见下面的参数)。然后显示PS3提示并从标准输入读取一行。如果该行包含与所显示的单词之一对应的数字,则将name的值设置为该单词。如果该行为空,则再次显示单词和提示。如果读取EOF,则命令完成。 读取任何其他值会导致name设置为null。读取行保存在变量REPLY中。在每次选择后执行列表,直到执行break命令。 select的退出状态是列表中执行的最后一个命令的退出状态,如果没有执行任何命令则为零。

所以只需改变你的

    * )
        echo "Invalid input: ${opt}"
        ;;

    * )
        echo "Invalid input: ${REPLY}"
        ;;