2012-08-17 61 views
41

在流行的命令式語言中,一旦case語句匹配後,switch語句通常會「通過」到下一個級別。案件陳述貫穿始終?

實施例:

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

將打印 「棕色狐狸」。

但是在bash

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

只打印「棕色」

相同的代碼我如何在bash case語句「砸鍋」像第一個例子中的其餘條件?

(編輯:猛砸版本3.2.25的; &聲明(from wiki)的結果是語法錯誤)

運行:

test.sh:

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

給出:

./test.sh:第6行:意外標記附近的語法錯誤;' ./test.sh:
line 6:
; &「

+0

添加錯誤;& – Resorath 2012-08-17 18:05:56

+0

相關(但不重複)的問題: [切換案例與fallthrough?](http://stackoverflow.com/q/5562253)(關於'|'操作符分離'case'表達式中的多個模式)。 – TachyonVortex 2015-07-02 09:41:16

回答

27

;&;;&運營商在bash 4.0中引入的,所以如果你想堅持一個五歲版本的bash,你要麼必須重複代碼,或者使用if秒。

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 

或找到其他方法來達到實際目標。 (。在一個側面說明,don't use all uppercase variable names你的風險覆蓋特殊的shell變量或環境變量)

+0

或使用功能不重複很多代碼.. – 2012-08-17 18:16:27

+0

關於bash版本的有趣的說明。 – Resorath 2012-08-17 18:17:46

+0

哇!謝謝,我現在看到我的'新'MacBookPro 2012有一個非常老的2007 Bash:GNU bash,版本3.2.48(1) - 發佈(x86_64-apple-darwin12) – AnneTheAgile 2013-12-07 18:07:25

17

試試這個:

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

感謝您的信息。儘管如此,我會改變第三種情況的「名稱」。到'somethingElse'。 – fotNelton 2015-10-19 10:20:36