开发者问题收集

如何让 switch 执行 2 个 case

2013-07-17
3766

如何使开关执行2个情况?

我尝试了以下代码,但仅执行第一个情况

704282748
3个回答

bash 中的 case 语句仅针对第一个匹配执行 COMMAND-LIST 中的命令。

但是,在 bash 版本 4 或更高版本中引入了 ;& 终止符。 ;;& 运算符类似于 ;; ,只是 case 语句在执行关联列表后不会终止 - Bash 只是继续测试下一个模式,就好像前一个模式不匹配一样。使用这些终止符,可以将 case 语句配置为针对所有模式进行测试,或者在块之间共享代码等。

参考: 摘自 http://wiki.bash-hackers.org/syntax/ccmd/case

因此,如果您拥有 bash v 4 或更高版本 ,这将提供您想要的结果:

#!/bin/sh
action="titi"

case "$action" in
    toto|titi)
    echo "1_$action"
    ;;&
    tata|titi)
    echo "2_$action"
    ;;
esac
jaypal singh
2013-07-17

也许可以考虑将 titi 作为在没有模式匹配时执行的默认值

#!/bin/sh
action="titi"

case "$action" in
    toto)
    echo "1_$action"
    ;;
    tata)
    echo "2_$action"
    ;;
    *)
    echo "1_$action"
    echo "2_$action"
esac
mirkobrankovic
2013-07-17

根据 @josay 的评论,这称为“fall through”,可以使用 bash 脚本在第一种情况下使用 ;;& 而不是 ;; 来实现。但“fall through”仅在 bash 版本为 4.0 或更高版本时才有效

接下来,源代码已更新“fall through”

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

case "$action" in
    toto|titi)
    echo "1_$action"
    ;;&
    tata|titi)
    echo "2_$action"
    ;;
esac
MOHAMED
2013-07-17