bash case 语句可以级联吗?

bash case 语句可以级联吗?

我正在尝试做这样的事情:

case $level in
    3)
        echo "Level Three"

    2)
        echo "Level Two"

    1)
        echo "Level one"
        ;;
esac

如果 $level = 3,它将输出

Level Three
Level Two
Level One

而如果$level = 1,它只会输出

Level One

但当我尝试时,我收到错误,syntax error near unexpected token ')'因为我没有包含;;.

我所知道的所有其他语言都允许这样做,有没有办法在 bash 中做到这一点?某种关键字的意思是“现在继续执行下一个案例,就好像它匹配一样”?

答案1

您需要使用;&而不是;;获得失败行为:

#! /bin/bash
foo() {
    case "$1" in
        3)
            echo "Level Three"
            ;&
        2)
            echo "Level Two"
            ;&
        1)
            echo "Level One"
            ;;
        a)
            echo "Level a"
            ;&
        b)
            echo "Level b"
            ;&
        c)
            echo "Level c"
            ;;
    esac
}
echo 3:
foo 3
echo 2:
foo 2
echo a:
foo a
3:
Level Three
Level Two
Level one
2:
Level Two
Level one
a:
Level a
Level b
Level c

请参阅条件结构bash 文档的部分。

另一个特殊标记是;;&,其中:

使 shell 测试下一个子句中的模式(如果有),并在成功匹配时执行任何关联的命令列表。

;;始终是最终的,不再测试进一步的模式。

#! /bin/bash

foo() {
    case "$1" in
        *3*)
            echo "Level Three"
            ;;&
        *2*)
            echo "Level Two"
            ;;&
        *1*)
            echo "Level One"
            ;;&
    esac
}

echo 12:
foo 12
echo 13:
foo 13
echo 23:
foo 23
12:
Level Two
Level One
13:
Level Three
Level One
23:
Level Three
Level Two

相关内容