bash caseステートメントはカスケードできますか?


29

私はこのようなことをしようとしています:

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でそれを行う方法はありますか?「次のケースをあたかも一致したかのように実行する」という意味のキーワード


2
知っているすべての言語でこれが許可されている場合は、Cとその模倣者以外の言語を学ぶ必要があります。ケースステートメントのフォールスルーは、Cでの歴史的な設計事故であり、何らかの原則のある言語で生き残ったものです。
ジル「SO-悪であるのをやめる」

回答:


42

フォールスルー動作を取得する;&代わりに使用する必要があり;;ます。

#! /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のドキュメントの「条件付き構成」セクションを参照してください。

もう1つの特別なマーカーは;;&、次のとおりです。

シェルは、次の句(存在する場合)のパターンをテストし、一致が成功すると関連するコマンドリストを実行します。

;; 常に最終的なものであり、それ以上のパターンはテストされません。

#! /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

18
移植性に関する注意:その構文はPOSIXではありません。これは、(2009年4月以降)および(1997年3.1.2以降)からksh入手できます。bash固有です。kshbashzsh;;&
ステファンシャゼル

4
また、にzsh相当するbash;;&;|(4.3.3、2007年に追加)であることに注意してください。
ステファンシャゼル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.