bash case 语句可以级联吗?

Ben*_*ird 37 bash shell-script

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

case $level in
    3)
        echo "Level Three"

    2)
        echo "Level Two"

    1)
        echo "Level one"
        ;;
esac
Run Code Online (Sandbox Code Playgroud)

如果 $level = 3,它将输出

Level Three
Level Two
Level One
Run Code Online (Sandbox Code Playgroud)

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

Level One
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*Mat 52

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

#! /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
Run Code Online (Sandbox Code Playgroud)
3:
Level Three
Level Two
Level one
2:
Level Two
Level one
a:
Level a
Level b
Level c
Run Code Online (Sandbox Code Playgroud)

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

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

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

;; 总是最终的,没有进一步的模式被测试。

#! /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
Run Code Online (Sandbox Code Playgroud)
12:
Level Two
Level One
13:
Level Three
Level One
23:
Level Three
Level Two
Run Code Online (Sandbox Code Playgroud)

  • 可移植性说明:该语法不是 POSIX。它来自`ksh`,可用于`ksh`、`bash`(自2009 年4.0 起)和`zsh`(自1997 年3.1.2 起)。`;;&` 是特定于 bash 的。 (22认同)
  • 另请注意,与`bash` 的`;;&` 等效的`zsh` 是`;|`(在2007 年4.3.3 中添加)。 (4认同)