在Case语句中使用带有多个选项的变量

use*_*076 2 variables bash switch-statement

是否有可能做类似以下的事情(以及如何?)(,或者为什么不呢?):

MATCH="--opt1 | --opt2"
while true ; do
    case $1 in
        $MATCH)
             echo "option $2" found;
             shift 2;;
        *)
             unknown option; exit 1;
    esac
done
Run Code Online (Sandbox Code Playgroud)

因为我不明白这不起作用.但是,只有像MATCH =" - opt1"这样的替代方案就可以了.

编辑1:可能的解决方案

可以简单地检查给定选项是否出现在多个允许选项的字符串中,而不是使用case语句,例如通过使用grep和if.要动态地完成它,可以考虑以下解决方案,它也可能与case语句结合或嵌入:

while true ; do
if [ -n "$(echo $MATCHES|grep -- $1)" ]; then
    echo "found option $1 with value $2"
    shift 2
fi
done
Run Code Online (Sandbox Code Playgroud)

che*_*ner 10

当嵌入参数值时,管道字符按字面处理,而不是语法.你必须使用多个字符串:

while true; do
    case $1 in
       $MATCH1 | $MATCH2 )
       # etc
Run Code Online (Sandbox Code Playgroud)