【问题标题】:how to make switch execute 2 cases如何使开关执行2种情况
【发布时间】:2013-07-17 13:12:35
【问题描述】:

如何让switch执行2个case?

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

#!/bin/sh
action="titi"

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

【问题讨论】:

  • 你想要的被称为“失败”。请看一下:stackoverflow.com/questions/12010686/case-statement-fallthrough
  • 预期的结果是什么,你得到了什么?你期待1_titi2_titi 在一起吗?
  • @VoidPointer 我期待 1_titi 和 2_titi 在一起
  • @josay 谢谢你的链接。我会把新代码作为答案。

标签: linux bash shell switch-statement


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果没有匹配的模式,可以考虑将titi 作为默认值来执行

    #!/bin/sh
    action="titi"
    
    case "$action" in
        toto)
        echo "1_$action"
        ;;
        tata)
        echo "2_$action"
        ;;
        *)
        echo "1_$action"
        echo "2_$action"
    esac
    

    【讨论】:

    • 它对我有用,但我必须在 tototata 周围添加一些 "
    【解决方案3】:

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

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

    #!/bin/sh
    action="$1"
    
    case "$action" in
        toto|titi)
        echo "1_$action"
        ;;&
        tata|titi)
        echo "2_$action"
        ;;
    esac
    

    【讨论】:

      【解决方案4】:

      使用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
      

      【讨论】:

      • 我想用switch语句而不是if
      猜你喜欢
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-21
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多