在Bash中使用变量作为案例模式

sie*_*z0r 21 bash pattern-matching switch-statement

我正在尝试编写一个Bash脚本,该脚本在case语句中使用变量作为模式.但是我无法让它发挥作用.

案例陈述:

case "$1" in
    $test)
        echo "matched"
        ;;
    *)
        echo "didn't match"
        ;;
esac
Run Code Online (Sandbox Code Playgroud)

我已经试过分配此$testaaa|bbb|ccc,(aaa|bbb|ccc),[aaa,bbb,ccc]和其他几个组合.我也尝试了这些作为case语句的模式:@($test),@($(echo $test)),$($test).也没有成功.

编辑

为清楚起见,我希望变量代表多个这样的模式:

case "$1" in
    aaa|bbb|ccc)
        echo "matched"
        ;;
    *)
        echo "didn't match"
        ;;
esac
Run Code Online (Sandbox Code Playgroud)

cho*_*oba 21

您可以使用以下extglob选项:

#! /bin/bash

shopt -s extglob         # enables pattern lists like +(...|...)
test='+(aaa|bbb|ccc)'

for x in aaa bbb ccc ddd ; do
    echo -n "$x "
    case "$x" in
        $test) echo Matches.
        ;;
        *) echo Does not match.
    esac
done
Run Code Online (Sandbox Code Playgroud)

  • +1提醒我使用`extglob`.顺便说一句`test ='@(aaa | bbb | ccc)'`也有效,在这种情况下可能是更好的选择. (2认同)