bashネストされたケース構文および;; ターミネーター


14

;;ネストされたを含むこのbashスクリプトに十分な(または多すぎる)ターミネーターがありcaseますか?

case "$1" in
OK)
    # Nothing needs done
    echo -n "OK:1" ;;

CRITICAL)

    case "$2" in
    SOFT)
        case "$3" in
        1|2) 
            soft_reset_pool.sh ;;
        esac ;;

    HARD)
        case "$3" in
        1|2)
            hard_reset_pool.sh ;;

        3|4)
            hard_reset_service ;;

        esac ;;
    esac ;;      
esac

私が怒りを覚えてから数年が経ちました。

回答:


36

;;sで適切なインデントを使用すると、追跡しやすくなります。

case "$1" in
OK)
    # Nothing needs done
    echo -n "OK:1"
    ;;

CRITICAL)

    case "$2" in
    SOFT)
        case "$3" in
        1|2) 
            soft_reset_pool.sh
            ;;
        esac
        ;;

    HARD)
        case "$3" in
        1|2)
            hard_reset_pool.sh
            ;;

        3|4)
            hard_reset_service
            ;;

        esac
        ;;
    esac
    ;;
esac

それらはうまくマッチし、すべてのcase ラベルに)終了があります;;

とは言うものの、すべてをネストされていない状態に折り畳む方が簡単および/または明確になる場合がありますcase

case "$1:$2:$3" in

OK:*)
    # Nothing needs done
    echo -n "OK:1"
    ;;

CRITICAL:SOFT:[12])
    soft_reset_pool.sh
    ;;

CRITICAL:HARD:[12])
    hard_reset_pool.sh
    ;;

CRITICAL:HARD:[34])
    hard_reset_service
    ;;

esac

1

複数のパターン文字列を処理する必要がある場合:

$ 3が文字列だと想像してください。

...
CRITICAL:HARD:@("A"|"B"|"C"))
...

Bashでは、スクリプトに以下を追加する必要があります。

shopt -s extglob

ヒントをくれたHauke Lagingに感謝します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.