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

Posted

技术标签:

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

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

假设 4 个输入组合是

    x=0y=0x=0, y=1, x=1y=0x=1, y=1.

但我不知道如何使用脚本来做到这一点。我已经尝试了代码,但它出现了语法错误。

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

【问题讨论】:

【参考方案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$SEPzero") echo "condtion 1"
    ;;
    "zero$SEPone") echo "conditon 2"
    ;;
    "one$SEPzero" ) echo "condition 3"
    ;;
    "one$SEPone") echo "condition 4"
    ;;
esac

【讨论】:

好答案。我会用-r 调用read 并使用换行符作为分隔符。

以上是关于是否可以在 Bash 脚本的 switch case 中结合两个条件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不运行Bash脚本的情况下语法检查?

在bash中检查命令行标志的正确方法

是否可以通过 smtp 通过 bash 脚本发送邮件?

玩转Bash脚本:选择结构之case

测试系统单元是否在bash脚本中处于活动状态

求Bash Shell脚本,判定文件是不是存在。