更复杂的 case 语句的正确语法如何?

更复杂的 case 语句的正确语法如何?
case "$1","$name" in
    -py | --python | --python3,*) if [[ "$name" =~ \..+$ ]]; then

那并没有捕捉到东西,实际上它应该捕捉到东西,比如……

USERNAME@HOSTNAME:~$ myscript --python surfer

有趣的事情:将多模式条件简化为......

    --python,*) if [[ "$name" =~ \..+$ ]]; then

它有效!由于极其重复的前景,必须将该部分放置 3 次:第一次为-py,然后为--python,最后为--python3捕获所有模式。

但另一件事是——相反:

case "$1" in
    -py | --python | --python3)    if [[ ! "$name" =~ \.py$ ]]; then

很好,有效!因此,这反驳了我的假设,即多模式语法可能不正确,可能需要删除空格,或者将所有 3 个模式的总和周围的任何类型的括号解释为一个组,其中第一个 OR 第二个 OR第三种模式应该被捕获。

综上所述,我确实有这样的印象:在 GNU bash 版本 4.3 中,你不能同时拥有多重模式和除了该条件之外的第二个条件,例如“$name”。可能是这样吗?或者我在尝试实现这一目标时犯了一个错误?

答案1

您的子句的对象case需要正确匹配:

case "$1","$name" in
    -py | --python | --python3,*) if [[ "$name" =~ \..+$ ]]; then

应该

case "$1","$name" in
    -py,* | --python,* | --python3,*) if [[ "$name" =~ \..+$ ]]; then

但这可能可以用更少的重复来更清楚地表达为:

if [[ "$name" =~ \..+$ ]]; then
    case "$1" in
        -py | --python | --python3)
            do_stuff
            ;;
    esac
fi

相关内容