2012-08-17 3 views
41

In populären Imperativ-Sprachen "fallen" Switch-Anweisungen im Allgemeinen auf die nächste Ebene, sobald eine Case-Anweisung abgeglichen wurde.Fallanweisung Fallthrough?

Beispiel:

int a = 2; 
switch(a) 
{ 
    case 1: 
     print "quick "; 
    case 2: 
     print "brown "; 
    case 3: 
     print "fox "; 
     break; 
    case 4: 
     print "jumped "; 
} 

würde "brown fox" drucken.

jedoch der gleiche Code in bash

A=2 
case $A in 
2) 
    echo "QUICK" 
    ;& 
2) 
    echo "BROWN" 
    ;& 
3) 
    echo "FOX" 
    ;& 
4) 
    echo "JUMPED" 
    ;& 
esac 

nur prints "BROWN"

Wie kann ich die Case-Anweisung in bash machen "fallen durch" auf die übrigen Bedingungen wie das erste Beispiel?

(edit: Bash Version 3.2.25, die; & Aussage (from wiki) führt zu einem Syntaxfehler)

Lauf:

test.sh:

#!/bin/bash 
A=2 
case $A in 
1) 
    echo "QUICK" 
    ;& 
2) 
    echo "BROWN" 
    ;& 
3) 
    echo "FOX" 
    ;& 
esac 

Gibt:

./test.sh: Zeile 6: Syntaxfehler in der Nähe des unerwarteten Tokens ;' ./test.sh:
line 6:
; & '

+0

Added Fehler für; & – Resorath

+0

Verwandte (aber nicht duplizieren) Frage: [Fall mit Fallthrough?] (Http://stackoverflow.com/q/5562253) (in Bezug auf den Operator '|' zum Trennen mehrerer Muster in einem 'case' Ausdruck). – TachyonVortex

Antwort

27

Die ;& und ;;& Operatoren wurden in bash 4.0, eingeführt, so, wenn Sie mit einem fünf Jahre alten Version von bash bleiben möchten, müssen Sie entweder den Code zu wiederholen, oder if s verwenden.

if ((a == 1)); then echo quick; fi 
if ((a > 0 && a <= 2)); then echo brown; fi 
if ((a > 0 && a <= 3)); then echo fox; fi 
if ((a == 4)); then echo jumped; fi 

oder finden Sie einen anderen Weg, um das eigentliche Ziel zu erreichen. (.. Auf einer Seite beachten, don't use all uppercase variable names Sie spezielle Shell-Variablen oder Umgebungsvariablen überschreiben Risiko)

+0

Oder verwenden Sie Funktionen, um nicht viel Code zu wiederholen. –

+0

Interessante Notiz über die Bash-Version. – Resorath

+0

Wow! Danke, ich sehe jetzt mein 'neues' MacBookPro 2012 hat eine sehr alte 2007 Bash: GNU Bash, Version 3.2.48 (1) -Release (x86_64-apple-darwin12) – AnneTheAgile

17

Try this:

case $VAR in 
normal) 
    echo "This doesn't do fallthrough" 
    ;; 
fallthrough) 
    echo -n "This does " 
    ;& 
somethingelse) 
    echo "fall-through" 
    ;; 
esac 
+2

Danke für die Info. Ich würde den "Namen" des dritten Falles ändern, obwohl z. zu 'etwaselse'. – fotNelton

Verwandte Themen