синтаксис вложенного регистра 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
geekosaur
источник
1

Если вам приходится иметь дело с несколькими строками шаблона:

Представьте, что $ 3 - это строка.

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

В Bash необходимо добавить следующее в скрипт:

shopt -s extglob

Спасибо Хауке Лагингу за отзыв.

Krapouille
источник