如何使开关执行2例

时间:2013-07-17 13:12:35

标签: linux bash shell switch-statement

如何让switch执行2个案例?

我尝试使用以下代码,但它只执行第一种情况

#!/bin/sh
action="titi"

case "$action" in
    toto|titi)
    echo "1_$action"
    ;;
    tata|titi)
    echo "2_$action"
    ;;
esac

4 个答案:

答案 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