Wie bekomme ich ein Fall-Through-Verhalten in Case-Anweisungen in Bash v3?

Ich habe gerade die folgende Syntax unter Linux getestet:

case "$OSTYPE" in linux-gnu*) ;;& linux*) echo $OSTYPE; ;; esac
case "$OSTYPE" in linux-gnu*) ;& linux*) echo $OSTYPE; ;; esac

was ohne Probleme funktioniert (siehe: Kann bash case-Anweisungen kaskadieren? ) mit GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu).

Aber unter OSX habe ich die folgenden Fehler:

-bash: syntax error near unexpected token `&'
-bash: syntax error near unexpected token `;'

Es ist GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13).

Irgendwelche Hinweise, wie man das gleiche Fall-Through-Verhalten auf Bash v3 erreichen kann?

Ist Ihr Code in den ersten Zeilen nur ein Beispiel oder der echte Code, den Sie ausführen möchten?
Es ist bereit, Code zum Kopieren und Einfügen auszuführen. Das eigentliche Skript ist .bashrc in den Zeilen 58-59, die auskommentiert sind, da sie unter OSX nicht funktionieren.

Antworten (1)

Aktualisieren Sie entweder Ihre Bash ( Homebrew ) oder Sie müssen sie mit einer Reihe von if-Anweisungen neu codieren:

case "$OSTYPE" in linux-gnu*) ;;& linux*) echo $OSTYPE; ;; esac
case "$OSTYPE" in linux-gnu*) ;& linux*) echo $OSTYPE; ;; esac

wäre

# first case
if [[ $OSTYPE == linux-gnu* ]]; then
    : # nothing in this branch
fi 
if [[ $OSTYPE == linux* ]]; then
    echo $OSTYPE
fi

# second case
function print_ostype { echo $OSTYPE; }
if [[ $OSTYPE == linux-gnu* ]]; then
    # nothing in this branch
    # include the next branch
    print_ostype
elif [[ $OSTYPE == linux* ]]; then
    print_ostype
fi

Ich habe im zweiten Fall eine Funktion verwendet, um die Codeduplizierung zu reduzieren, falls mehrere Anweisungen vorhanden sind.

:Sie sollten den für den leeren Zweig verwenden ... der reine # ...Fehler wirft ;)