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

Asc*_*ian 3 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
Run Code Online (Sandbox Code Playgroud)

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

e0k*_*e0k 5

来自man bash

select name [ in word ] ; do list ; done

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

所以只需改变你的

    * )
        echo "Invalid input: ${opt}"
        ;;
Run Code Online (Sandbox Code Playgroud)

    * )
        echo "Invalid input: ${REPLY}"
        ;;
Run Code Online (Sandbox Code Playgroud)