bash iç içe vaka sözdizimi ve ;; terminatörleri


14

;;Bu bash komut dosyasında iç içe geçmiş olanları içeren yeterli (veya belki çok fazla) sonlandırıcı var mı 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

Öfke içinde bir bash yaptığımdan beri birkaç yıl geçti.

Yanıtlar:


36

Eğer ;;s üzerinde mantıklı girinti kullanırsanız takip etmek daha kolaydır .

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

İyi eşleşiyorlar, her case etiketin) bir sonlandırması var;;

Bununla birlikte, bazen her şeyi iç içe olmayan bir yere daraltmak daha kolay ve / veya daha nettir 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

Birden çok desen dizesiyle ilgilenmeniz gerekiyorsa:

3 $ dize olduğunu düşünün.

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

Bash'de betiğe aşağıdakileri eklemeniz gerekir:

shopt -s extglob

Hauke ​​Laging'e bahşiş için teşekkürler .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.