Bash verschachtelte Groß- / Kleinschreibung und ;; Terminatoren

14

Habe ich genug (oder vielleicht zu viele) ;;Abschlusszeichen in diesem Bash-Skript, das verschachtelte Zeichen enthält 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

Es ist ein paar Jahre her, dass ich mich vor Wut geschlagen habe.

Kev
quelle

Antworten:

35

Es ist einfacher, den Überblick zu behalten, wenn Sie die ;;s sinnvoll einrücken .

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

Sie passen gut zusammen, jedes case Etikett) hat einen Abschluss;;

Das heißt, manchmal ist es einfacher und / oder übersichtlicher, alles in ein nicht verschachteltes Element zusammenzufassen 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
Geekosaurier
quelle
1

Wenn Sie mit mehreren Musterzeichenfolgen arbeiten müssen:

Stellen Sie sich vor, $ 3 ist eine Zeichenfolge.

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

In Bash müssen Sie dem Skript Folgendes hinzufügen:

shopt -s extglob

Danke an Hauke ​​Laging für den Tipp.

Krapouille
quelle