开发者问题收集

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

2021-09-06
2893

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

假设输入的四个组合是:

  1. x=0 , y=0 ,
  2. x=0 , y=1 ,
  3. x=1 , y=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
3个回答

您可以将 $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
ceving
2021-09-06

您可以使用分隔符:

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
Arnaud Valmary
2021-09-06

Case 是关于模式匹配的,请查看:

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

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

因此,您只需将模式传递给 case。在您的案例中,可能是这样的:

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
Ivan
2021-09-06