【问题标题】:Is it possible to combine two conditions in switch case for Bash script?是否可以在 Bash 脚本的 switch case 中结合两个条件?
【发布时间】:2021-11-03 07:33:04
【问题描述】:

假设我想读取两个输入,例如 x 和 y。根据它们的值,我想在 Bash 脚本中执行 switch case。

假设 4 个输入组合是

  1. x=0y=0
  2. x=0, y=1,
  3. x=1y=0
  4. x=1, y=1.

但我不知道如何使用脚本来做到这一点。我已经尝试了代码,但它出现了语法错误。是否可以在 Bash 脚本的 switch case 中结合两个条件?

echo "enter x"
read x

echo "enter y"
read y

case "$x" "$y" in
    "zero" "zero") echo "condtion 1"
    ;;
    "zero" "one") echo "conditon 2"
    ;;
    "one" "zero" ) echo "condition 3"
    ;;
    "one" "one") echo "condition 4"
    ;;
esac

【问题讨论】:

    标签: bash shell script


    【解决方案1】:

    案例是关于模式匹配的,看看这个:

    $ case "a" in
    >       b) echo fail;;
    >       a) echo ok  ;;
    > esac
    ok
    
    $ case "b" in
    >       b) echo fail;;
    >       a) echo ok  ;;
    > esac
    fail
    

    因此,您只需将模式传递给案例。在你的情况下可能是这样的:

    read -p "enter x(0|1): " x
    read -p "enter y(0|1): " y
        
    case "$x$y" in
           00) echo "condition 1";;
           01) echo "condition 2";;
           10) echo "condition 3";;
           11) echo "condition 4";;
    esac
    

    为了更好的可读性(主要)需要一个分隔符。

    case "$x|$y" in
           0|0) echo "condition 1";;
           0|1) echo "condition 2";;
           1|0) echo "condition 3";;
           1|1) echo "condition 4";;
    esac
    

    【讨论】:

      【解决方案2】:

      您可以将$x$y 视为一个二进制数。

      #! /bin/bash
      
      read -p 'enter x: ' x
      read -p 'enter y: ' y
      
      case $((2#$x$y)) in
        0) echo 'condition 1';;
        1) echo 'condition 2';;
        2) echo 'condition 3';;
        3) echo 'condition 4';;
      esac
      

      这适用于多达 64 种不同的状态:

      $ echo $((64#11))
      65
      

      【讨论】:

        【解决方案3】:

        你可以使用分隔符:

        echo "enter x"
        read x
        
        echo "enter y"
        read y
        
        SEP=":::"
        case "${x}${SEP}${y}" in
            "zero${SEP}zero") echo "condtion 1"
            ;;
            "zero${SEP}one") echo "conditon 2"
            ;;
            "one${SEP}zero" ) echo "condition 3"
            ;;
            "one${SEP}one") echo "condition 4"
            ;;
        esac
        

        【讨论】:

        • 好答案。我会用-r 调用read 并使用换行符作为分隔符。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-10
        • 2017-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-06
        相关资源
        最近更新 更多