如何使交换机执行2例?
我尝试使用下面的代码,但它只执行第一种情况
#!/bin/sh action="titi" case "$action" in toto|titi) echo "1_$action" ;; tata|titi) echo "2_$action" ;; esac
bash中的case
语句仅执行第一个匹配的COMMAND-LIST
中的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
基于@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
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
如果没有模式匹配,可以考虑使用默认值执行
#!/bin/sh action="titi" case "$action" in toto) echo "1_$action" ;; tata) echo "2_$action" ;; *) echo "1_$action" echo "2_$action" esac