syntaxe de casse imbriquée bash et ;; terminateurs

14

Ai-je assez (ou peut-être trop) de ;;terminateurs dans ce script bash contenant des imbriqués 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

Cela fait quelques années que je n'ai fait aucun coup de colère.

Kev
la source

Réponses:

36

Il est plus facile de garder une trace si vous utilisez une indentation sensible sur le ;;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

Ils correspondent bien, chaque case étiquette) ayant une terminaison;;

Cela dit, il est parfois plus facile et / ou plus clair de tout réduire en un non-imbriqué 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
geekosaure
la source
1

Si vous devez gérer plusieurs chaînes de modèle:

Imaginez que 3 $ est une chaîne.

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

Dans Bash, vous devez ajouter ce qui suit dans le script:

shopt -s extglob

Merci à Hauke ​​Laging pour l'astuce.

Krapouille
la source