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

使用变量作为 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

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

但该${action_list} )构造不起作用。现在我尝试对它进行硬编码,list|add|rem)...并且它有效。

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

答案1

检查文档:

case

case 命令的语法为:

案件单词
    [ [(]图案[|图案]...) 命令列表 ;;]... esac

[...] 每个图案进行波形符扩展、参数扩展、命令替换和算术扩展。

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

答案2

由于您只有两个回复,因此我认为case这不是正确的解决方案。有很多方法可以解决这个问题;我会做这样的事情:

action_list="list|add|remove|foo|bar"
if grep -qE "^(${action_list})$" <<< "${action_var}" ; then
  echo valid
else
  echo not valid ${action_var}
fi

如果您使用的是 bash 或具有类似变量扩展的 shell,这可能更适合列表变量的可读性:

action_list="list add remove foo bar"
if grep -qE "^(${action_list// /|})$" <<< "${action_var}" ; then
  echo valid
else
  echo not valid ${action_var}
fi

相关内容