4

如何让 switch 执行 2 种情况?

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

#!/bin/sh
action="titi"

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

4 回答 4

11

casebash 中的语句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
于 2013-07-17T13:53:29.323 回答
1

titi如果没有匹配的模式,也许考虑执行一个默认值

#!/bin/sh
action="titi"

case "$action" in
    toto)
    echo "1_$action"
    ;;
    tata)
    echo "2_$action"
    ;;
    *)
    echo "1_$action"
    echo "2_$action"
esac
于 2013-07-17T13:22:11.533 回答
1

根据@josay评论,这被称为“失败”,可以通过使用 bash 脚本来完成,;;&而不是;;在第一种情况下。但是“失败”仅在 bash 版本为 4.0 或更高版本时才有效

以下,源代码更新为“失败”

#!/bin/sh
action="$1"

case "$action" in
    toto|titi)
    echo "1_$action"
    ;;&
    tata|titi)
    echo "2_$action"
    ;;
esac
于 2013-07-17T13:50:21.203 回答
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
于 2013-07-17T13:18:06.627 回答