在流行的命令式语言中,一旦case语句匹配,switch语句通常会"落到"下一级.
例:
int a = 2;
switch(a)
{
case 1:
print "quick ";
case 2:
print "brown ";
case 3:
print "fox ";
break;
case 4:
print "jumped ";
}
Run Code Online (Sandbox Code Playgroud)
会印出"棕色狐狸".
但是bash中的代码相同
A=2
case $A in
2)
echo "QUICK"
;&
2)
echo "BROWN"
;&
3)
echo "FOX"
;&
4)
echo "JUMPED"
;&
esac
Run Code Online (Sandbox Code Playgroud)
只打印"布朗"
如何将bash中的case语句"覆盖"到第一个示例之类的剩余条件?
(编辑:Bash版本3.2.25,;&语句(来自wiki)导致语法错误)
运行:
test.sh:
#!/bin/bash
A=2
case $A in
1)
echo "QUICK"
;&
2)
echo "BROWN"
;&
3)
echo "FOX"
;&
esac
Run Code Online (Sandbox Code Playgroud)
得到:
./test.sh:line 6:意外令牌附近的语法错误 ;&'
;' ./test.sh:
line 6:
gei*_*rha 36
在;&与;;&运营商在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
Run Code Online (Sandbox Code Playgroud)
或者找到其他方法来实现目标.
(另请注意,不要使用所有大写变量名.您可能会覆盖特殊的shell变量或环境变量.)
Ren*_*amp 31
试试这个:
case $VAR in
normal)
echo "This doesn't do fallthrough"
;;
fallthrough)
echo -n "This does "
;&
somethingelse)
echo "fall-through"
;;
esac
Run Code Online (Sandbox Code Playgroud)
使用;&不是很便携,因为它需要bash(不是ash、dash或任何其他最小的sh)并且它至少需要bash4.0 或更高版本(并非在所有系统上都可用,例如 macOS 10.14.6 仍然只提供 bash 3.2.57)。
我认为比很多if's更易于阅读的解决方法是循环并修改 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
Run Code Online (Sandbox Code Playgroud)