我正在寻找switch语句的正确语法,其中包含Bash中的初级案例(理想情况下不区分大小写)。 在PHP中,我会像以下一样编程:
switch($c) {
case 1:
do_this();
break;
case 2:
case 3:
do_what_you_are_supposed_to_do();
break;
default:
do_nothing();
}
我想在Bash中使用相同的内容:
case "$C" in
"1")
do_this()
;;
"2")
"3")
do_what_you_are_supposed_to_do()
;;
*)
do_nothing();
;;
esac
这在某种程度上不起作用:当$ C为2或3时,应该触发函数do_what_you_are_supposed_to_do()
。
答案 0 :(得分:269)
使用竖线(|
)表示“或”。
case "$C" in
"1")
do_this()
;;
"2" | "3")
do_what_you_are_supposed_to_do()
;;
*)
do_nothing()
;;
esac
答案 1 :(得分:79)
最新的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
答案 2 :(得分:24)
()
。[23]
以匹配2
或3
''
代替""
如果括在""
中,解释器(不必要地)会在匹配之前尝试扩展值中的可能变量。
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
)
答案 3 :(得分:11)
试试这个:
case $VAR in
normal)
echo "This doesn't do fallthrough"
;;
special)
echo -n "This does "
;&
fallthrough)
echo "fall-through"
;;
esac
答案 4 :(得分:9)
如果值为整数,则可以使用[2-3]
,或者可以将[5,7,8]
用于非连续值。
#!/bin/bash
while [ $# -gt 0 ];
do
case $1 in
1)
echo "one"
;;
[2-3])
echo "two or three"
;;
[4-6])
echo "four to six"
;;
[7,9])
echo "seven or nine"
;;
*)
echo "others"
;;
esac
shift
done
如果值是字符串,那么您可以使用|
。
#!/bin/bash
while [ $# -gt 0 ];
do
case $1 in
"one")
echo "one"
;;
"two" | "three")
echo "two or three"
;;
*)
echo "others"
;;
esac
shift
done