代码之家  ›  专栏  ›  技术社区  ›  Ascalonian

从bash case语句获取通配符值

  •  3
  • Ascalonian  · 技术社区  · 10 年前

    我想知道如何从大小写通配符中获取值?我有一个为我生成菜单的数组,然后有一个决定选择哪个选项的案例。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 回复  |  直到 10 年前
        1
  •  5
  •   Community Mohan Dere    5 年前

    从…起 man bash :

    select name [ in word ] ; do list ; done

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

    所以只要改变你的

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

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