如何让switch执行2个案例?
我尝试使用以下代码,但它只执行第一种情况
#!/bin/sh
action="titi"
case "$action" in
toto|titi)
echo "1_$action"
;;
tata|titi)
echo "2_$action"
;;
esac
答案 0 :(得分:7)
bash中的case
语句仅针对第一个匹配执行COMMAND-LIST
中的命令。
但是,在bash version 4
或更高版本中引入了;&
终止符。 ;;&
运算符与;;
类似,除了case语句在执行关联列表后不会终止 - Bash只是继续测试下一个模式,就像前一个模式不匹配一样。例如,使用这些终结符,可以将case语句配置为针对所有模式进行测试,或者在块之间共享代码。
参考:摘录自http://wiki.bash-hackers.org/syntax/ccmd/case
所以,如果你有bash v 4 or later
,这会得到你想要的结果:
#!/bin/sh
action="titi"
case "$action" in
toto|titi)
echo "1_$action"
;;&
tata|titi)
echo "2_$action"
;;
esac
答案 1 :(得分:1)
基于 @josay 评论,这称为“堕落”,并且可以在第一种情况下使用;;&
代替;;
来使用bash脚本完成。但是“堕落”仅在bash版本为4.0或更高版本时才有效
关注,源代码使用“fall through”更新
#!/bin/sh
action="$1"
case "$action" in
toto|titi)
echo "1_$action"
;;&
tata|titi)
echo "2_$action"
;;
esac
答案 2 :(得分:0)
使用if
两次,匹配两次。
if [ "$action" = 'toto' -o "$action" = 'titi' ]; then
echo "1_$action"
fi
if [ "$action" = 'tata' -o "$action" = 'titi' ]; then
echo "2_$action"
fi
如果您需要使用case
,请使用function
function f1
{
echo "1_$action"
}
function f2
{
echo "2_$action"
}
case "$action" in
titi)
f1
f2
;;
toto)
f1
;;
tata)
f2
;;
esac
答案 3 :(得分:0)
如果没有模式匹配,可能会考虑titi
执行默认值
#!/bin/sh
action="titi"
case "$action" in
toto)
echo "1_$action"
;;
tata)
echo "2_$action"
;;
*)
echo "1_$action"
echo "2_$action"
esac