在流行的命令式语言中,一旦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中的case语句“覆盖”到第一个示例中的其余条件?
(编辑:Bash版本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:line 6:意外令牌
;' ./test.sh:
附近的语法错误;&'
line 6:
答案 0 :(得分:31)
在bash 4.0中引入了;&
和;;&
运算符,因此如果您想坚持使用五年前版本的bash,则必须重复代码或使用{{ 1}} S上。
if
或找到其他方法来实现目标。
(旁注,don't use all uppercase variable names。您可能会覆盖特殊的shell变量或环境变量。)
答案 1 :(得分:25)
试试这个:
case $VAR in
normal)
echo "This doesn't do fallthrough"
;;
fallthrough)
echo -n "This does "
;&
somethingelse)
echo "fall-through"
;;
esac
答案 2 :(得分:0)
使用;&
的可移植性不是很高,因为它需要bash
(不是ash
,dash
或真实的sh
),并且至少需要bash
4.0或更高版本(并非在所有系统上都可用)。
一种解决方法,我认为它比许多if
的is循环好,并修改了大小写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