[英]Does bash have a `default`-equivalent for the case statement when using fallthrough?
[英]Case statement fallthrough?
在流行的命令式語言中,一旦 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
只打印“BROWN”
如何使 bash 中的案例陳述像第一個示例一樣“落空”到其余條件?
(編輯:Bash 版本 3.2.25,;& 語句(來自維基)導致語法錯誤)
跑步:
測試.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:;'./test.sh:
line 6:;'./test.sh:
;&'
line 6:
;&
和;;&
運算符是bash 4.0中引入的,因此,如果您要堅持使用5年的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
或尋找其他方法來達到實際目標。
(附帶說明, 請不要使用所有大寫的變量名 。您可能會覆蓋特殊的Shell變量或環境變量。)
嘗試這個:
case $VAR in
normal)
echo "This doesn't do fallthrough"
;;
fallthrough)
echo -n "This does "
;&
somethingelse)
echo "fall-through"
;;
esac
使用一系列具有模式交替的 case 語句:
#!/bin/sh
a="2"
case "$a" in
"1")
echo "QUICK"
;;
esac
case "$a" in
"1" | "2")
echo "BROWN"
;;
esac
case "$a" in
"1" | "2" | "3")
echo "FOX"
;;
esac
case "$a" in
"4")
echo "JUMPED"
;;
esac
好處:
a
無序字符串值將起作用缺點:
請注意,對於非環境變量,小寫a
比大寫A
更好,並且$a
以及大小寫模式應該在a
中可能有空格的一般情況下被引用。 對於簡單的情況,可以刪除引號。
解決方法:正則表達式
#! /bin/sh
case x in
x|y) echo yay;;
*) echo default;;
esac
使用;&
並不是很可移植,因為它需要bash
(不是ash
, dash
或任何其他最小的sh
),並且至少需要bash
4.0或更高版本(並非在所有系統上都可用,例如macOS 10.14.6仍然僅提供bash 3.2) .57)。
我認為,一種解決方法比許多if
的is循環好閱讀,並且修改case var更好:
#!/bin/sh
A=2
A_BAK=$A
while [ -n "$A" ]; do
case $A in
1)
echo "QUICK"
A=2
;;
2)
echo "BROWN"
A=3
;;
3)
echo "FOX"
A=4
;;
4)
echo "JUMPED"
A=""
;;
esac
done
A=$A_BAK
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.