如何让 switch 执行 2 种情况?
我尝试使用以下代码,但它只执行第一种情况
#!/bin/sh
action="titi"
case "$action" in
toto|titi)
echo "1_$action"
;;
tata|titi)
echo "2_$action"
;;
esac
如何让 switch 执行 2 种情况?
我尝试使用以下代码,但它只执行第一种情况
#!/bin/sh
action="titi"
case "$action" in
toto|titi)
echo "1_$action"
;;
tata|titi)
echo "2_$action"
;;
esac
case
bash 中的语句COMMAND-LIST
仅执行第一个匹配项中的命令。
但是,Inbash 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
titi
如果没有匹配的模式,也许考虑执行一个默认值
#!/bin/sh
action="titi"
case "$action" in
toto)
echo "1_$action"
;;
tata)
echo "2_$action"
;;
*)
echo "1_$action"
echo "2_$action"
esac
根据@josay评论,这被称为“失败”,可以通过使用 bash 脚本来完成,;;&
而不是;;
在第一种情况下。但是“失败”仅在 bash 版本为 4.0 或更高版本时才有效
以下,源代码更新为“失败”
#!/bin/sh
action="$1"
case "$action" in
toto|titi)
echo "1_$action"
;;&
tata|titi)
echo "2_$action"
;;
esac
使用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