是否可以在 Bash 脚本的 switch case 中组合两个条件?

Is it possible to combine two conditions in switch case for Bash script?

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

假设输入的 4 种组合是

  1. x=0y=0
  2. x=0y=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

您可以使用分隔符:

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

你可以把$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

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

$ 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