bash sintaxe de caso aninhado e ;; terminadores

9

Eu tenho (ou talvez muitos) ;; terminadores suficientes neste script bash contendo aninhados 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

Faz alguns anos desde que eu fiz alguma festa de raiva.

    
por Kev 18.06.2011 / 03:53

2 respostas

27

É mais fácil acompanhar se você usa recuo sensível no ;; 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

Eles combinam bem, cada case rótulo ) tendo uma finalização ;;

Dito isso, às vezes é mais fácil e / ou mais claro recolher tudo em um case não aninhado:

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
    
por 18.06.2011 / 04:02
0

Se você tiver que lidar com várias sequências de caracteres padrão:

Imagine $ 3 é uma string.

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

No Bash você precisa adicionar o seguinte no script:

shopt -s extglob

Obrigado a Hauke Laging pela dica.

    
por 04.06.2014 / 14:24

Tags