2011-04-06 73 views
98

我正在尋找開關語句的正確語法與在Bash(理想情況下不區分大小寫)傳遞案件。 在PHP我會編程,它想:切換案例與fallthrough?

switch($c) { 
    case 1: 
     do_this(); 
     break; 
    case 2: 
    case 3: 
     do_what_you_are_supposed_to_do(); 
     break; 
    default: 
     do_nothing(); 
} 

我希望同樣的擊:

case "$C" in 
    "1") 
     do_this() 
     ;; 
    "2") 
    "3") 
     do_what_you_are_supposed_to_do() 
     ;; 
    *) 
     do_nothing(); 
     ;; 
esac 

這不知何故不工作:功能do_what_you_are_supposed_to_do()應該被解僱時,$ C是2或3。

+2

不使用通話功能與括號!既然你可以在bash中使用'function fname {echo「Inside fname」;返回0; }'或'fname(){echo「inside fname」;}返回0; }'把parens放在一個函數調用上看起來像是一個函數定義。函數應該像任何其他命令行程序一樣被調用,例如'mv','cp','rsync','ls','cd'等等......在這種情況下,我們調用fname如下:'fname $ ARGS' 。 – 2015-12-17 17:36:04

+0

'do_nothing()'應該是一個SKIP語句?使用':'。 – sjas 2016-07-21 12:01:45

回答

176

對「或」使用垂直條(|)。

case "$C" in 
"1") 
    do_this() 
    ;; 
"2" | "3") 
    do_what_you_are_supposed_to_do() 
    ;; 
*) 
    do_nothing() 
    ;; 
esac 
+19

或在這種情況下,簡單的字符類'[23])' – SiegeX 2011-04-06 06:50:20

22
  • ,除非你想定義他們不要使用()落後於bash函數名。
  • 使用[23]萬一匹配23
  • 靜態字符串的情況下應該由''括代替""

如果封閉在"",解釋器(不必要)試圖擴大在值的可能變量匹配前。

case "$C" in 
'1') 
    do_this 
    ;; 
[23]) 
    do_what_you_are_supposed_to_do 
    ;; 
*) 
    do_nothing 
    ;; 
esac 

對於不區分大小寫的匹配,可以使用字符類(如[23]):

case "$C" in 

# will match C='Abra' and C='abra' 
[Aa]'bra') 
    do_mysterious_things 
    ;; 

# will match all letter cases at any char like `abra`, `ABRA` or `AbRa` 
[Aa][Bb][Rr][Aa]) 
    do_wild_mysterious_things 
    ;; 

esac 

abra沒有擊中任何時間,因爲它會通過第一種情況相匹配。

如果需要,您可以在第一種情況下省略;;以在下列情況下繼續測試匹配項。 (;;跳到esac

+0

您還可以將C至小寫'案「$ {C} ,,」 in'如果案件並不重要 – Sprinterfreak 2014-03-22 12:02:55

+0

如果你省略了,會發生什麼'';;?你不應該使用';&'來實現穿越嗎? – HelloGoodbye 2016-01-22 16:21:45

+0

如果我省略';;'我需要使用';;&',如果我想繼續測試,則會出現語法錯誤。 – Jasen 2016-10-27 20:53:33

45

最近bash版本允許秋季,通過在;;代替使用;&: 它們還允許通過使用;;&有恢復的情況下檢查。

for n in 4 14 24 34 
do 
    echo -n "$n = " 
    case "$n" in 
    3?) 
    echo -n thirty- 
    ;;& #resume (to find ?4 later) 
    "24") 
    echo -n twenty- 
    ;& #fallthru 
    "4" | ?4) 
    echo -n four 
    ;;& # resume (to find teen where needed) 
    "14") 
    echo -n teen 
    esac 
    echo 
done 

樣本輸出

4 = four 
14 = fourteen 
24 = twenty-four 
34 = thirty-four 
8

試試這個:

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

這是一個非常有用的提示。至少對於Bash 4.3.11來說。我沒有打擾過任何其他人嘗試。 – Daniel 2015-12-06 04:50:00

+0

謝謝謝謝謝謝謝謝! – 2016-07-18 07:39:55

+1

注意:這對於bash 3.2不起作用,它仍然是macOS中的默認bash。 – 2016-10-26 16:44:04