使用变量作为 case 命令的模式

use*_*323 7 bash case

所以这是我的代码:

#!/bin/bash

action_list='list|add|rem'

while true; do
        echo "Actions include: list - show list
                                add - add item to list
                                rem - remove item from list"
        read -p "Input action: " action_var

        case $action_var in
                ${action_list} ) echo "Option $action_var is valid";;
                *) echo "Option $action_var is INVALID";;
        esac

        echo $action_var
done
Run Code Online (Sandbox Code Playgroud)

我想要的是使用 case 命令,以便将来如果我添加更多选项,我不需要对它们进行硬编码,我可以只使用“action_list”变量。

但是${action_list} )构造不起作用。现在我尝试对其进行硬编码,list|add|rem)...并且可以正常工作。

为什么在这种情况下变量不起作用?

mur*_*uru 4

检查文档:

\n\n
\n

case

\n\n

case 命令的语法为:

\n\n
\n [ [ ( ]模式[|模式]\xe2\x80\xa6) 命令列表 ;;]\xe2\x80\xa6 esac
\n\n

[...] 每个图案都会经历波形符扩展、参数扩展、命令替换和算术扩展。

\n
\n\n

所发生的情况是在模式被识别(使用分隔符)之后发生参数扩展|。扩展中的A|只是普通|字符,而不是模式分隔符。(与我的另一个答案类似的推理。)

\n