在上一篇文章中,我们已经了解了如何使用条件语句 bash 评估条件并根据结果做出决定。 同样,在本文中,我们将学习如何使用 案例陈述 在 Bash 脚本中,它也用于评估条件。 您可以使用 Bash case 语句而不是编写一长串 if..elif..else
陈述。 如果您对条件语句一无所知,我们有一篇关于该主题的详细文章。 我建议您在阅读本文之前先看看它。
- Bash 脚本 – 条件语句
案例语句语法
case语句的语法在 bash 如下:
case expression in pattern1) STATEMENTS ;; pattern2) STATEMENTS ;; Pattern3 | Pattern4 | pattern5) STATEMENTS ;; pattern-N) STATEMENTS ;; *) STATEMENTS ;; esac
解释:
- 关键字
"case"
和"esac"
标记 case 语句的开始和结束。 - 关键字 case 后面应该跟一个
"expression"
. 将评估此表达式并根据模式列表搜索输出。 - 表达式后,
"in"
关键字应该写,它指向"value in patterns"
. - 您可以根据需要创建任意数量的模式。 你可以把每个模式想象成一个
if
和elif
条件语句中的子句。 如果从表达式计算的值与模式匹配,则该模式将运行其代码块。 剩余的花样将被跳过。 - 模式中的每个语句都应该以 双分号 (
;;
)。 - 与 if 语句中的 else 子句类似,在 case 语句中有一个默认模式称为 星号 (
*
) 如果没有任何模式匹配,它将运行它的代码块。
示例 1 – 使用 case 语句的计算器
在这个 example,我使用 case 语句创建了一个简单的计算器。 让我解释一下当你运行这段代码时会发生什么。
- 提示用户输入两个数字并存储在变量中
"X"
和"Y"
. - 提示用户输入运算类型(加、减、乘、除)并存储在变量中 “操作员”.
- 在case语句变量 “操作员” 被评估和不同 模式 (
+
,-
,x
,/
,%
) 是为不同的操作创建的。 - 如果模式匹配,特定模式将运行其语句,跳过 case 语句中的所有其他模式。
- 如果您尝试输入所需算术运算符以外的任何其他值,则默认 图案 (
*
) 将运行它的语句。
#!/usr/bin/env bash read -p "Enter the first number(X) : " X read -p "Enter the second number(Y) : " Y read -p " Addition => + Subtract => - Multiply => x Division => / Reminder => % Choose any one operator : " OPERATOR case "$OPERATOR" in +) echo -e "nAddition of X and Y is $(( X + Y ))" ;; -) echo -e "nSubtraction of X and Y is $(( X - Y ))" ;; x) echo -e "nMultiply X and Y is $(( X * Y ))" ;; /) echo -e "nDivision of X and Y is $(( X / Y ))" ;; %) echo -e "nReminder of X and Y is $(( X % Y ))" ;; *) echo -e "n[ERROR] You have chosen an operator that is not in the list. You can choose either(+, -, x, /, %) operator from the list. Rerun the program again." esac
看看下面的图片,我正在提交代码并选择 “加法运算符”.
我再次运行相同的代码,但这次给出一个随机值,这将成为默认模式(*
) 运行它的语句。
示例 2 – 在单个子句中创建多个模式
在上一个 example,我们为不同的算术运算符创建了不同的模式。 也可以在同一个子句中创建多个模式,如果任何模式匹配,则特定语句将运行。 语法将相同,但您将添加一个 管道 象征 (|
) 并在同一行中添加不同的模式,如下所示。
case expression in Pattern1 | Pattern2 | pattern3) STATEMENTS ;; *) STATEMENTS ;; esac
在下面 example,用户将输入年份作为输入,并将从 IPL 数据中获取橙色上限详细信息。 在 2015 年、2017 年和 2019 年,同一个玩家赢得了橙色帽子,所以我在同一个条款中创建了一个不同的年份。
read -p "Choose the year between 2015 - 2021 to get orange cap player name: " CAP case "$CAP" in 2015 | 2017 | 2019) echo -e "nOrange cap winner for $YEAR is David Warner" ;; 2016) echo -e "nOrange cap winner for $YEAR is Virat Kohli" ;; 2018) echo -e "nOrange cap winner for $YEAR is Kane Williamson" ;; 2020) echo -e "nOrange cap winner for $YEAR is KL Rahul" ;; 2021) echo -e "nOrange cap winner for $YEAR is Ruturaj Gaikwad" ;; *) echo -e "n[ERROR] Enter the year between 2015 - 2021." esac

示例 3 – case 语句中的模式匹配
模式匹配 可用于 case 语句。 我正在使用相同的 example 来自上一节,但添加了一个额外的模式 (20[2-9][2-9])
如果用户输入 2021 年以上的任何年份,它将打印一条消息,说明“系列尚未发生”。
read -p "Choose the year between 2015 - 2021 to get orange cap player name: " CAP case "$CAP" in 2015 | 2017 | 2019) echo -e "nOrange cap winner for $YEAR is David Warner" ;; 2016) echo -e "nOrange cap winner for $YEAR is Virat Kohli" ;; 2018) echo -e "nOrange cap winner for $YEAR is Kane Williamson" ;; 2020) echo -e "nOrange cap winner for $YEAR is KL Rahul" ;; 2021) echo -e "nOrange cap winner for $YEAR is Ruturaj Gaikwad" ;; 20[2-9][2-9]) echo -e "nSeries is yet to happen for the year $CAP" ;; *) echo -e "n[ERROR] Enter the year between 2015 - 2021." esac

示例 4 – 获取用户确认
有时您可能会要求用户提供确认以继续执行程序的下一步。 对于此用例,使用 case 语句将是一个不错的选择。
在上一个 example模式写在一行中,语句写在另一行中,但您也可以将模式和语句写在一行中,如下所示。
read -p "Input file is received in CSV format, Please confirm to load the data into production database : " CONFIRM case "$CONFIRM" in [Yy] | [Yy][Ee][Ss] ) echo "++ Running the utility to load the data to the database.." ;; [Nn] | [Nn][Oo] ) echo -e "++ Skipping load db step upon user confirmation..n Exiting the script.." ;; *) echo -e "[ERROR] = Wrong Input, Exiting the script.." esac

示例 5 – 带有返回码的 Case 语句
您可以编写逻辑来捕获先前运行的命令的返回码,并使用 case 语句执行一些操作。 我正在创建一个 GUI 对话框来接受用户使用的用户名和密码 禅度. 如果用户成功提交了用户名和密码,zenity 会将返回码设为零,并基于它添加了添加新用户的逻辑。 任何非零值,都会抛出错误消息。
INFO=$(zenity --password --username) case $? in 0) USERNAME=$(echo ${INFO} | awk -F "|" '{ print $1 }') PASSWORD=$(echo ${INFO} | awk -F "|" '{ print $2 }') useradd -m -p "${PASSWORD}" "${USERNAME}" ;; *) echo "[ERROR] - User not added." esac

我已经按下 “取消” 对话框中的按钮,因此使用默认模式(*
)。

建议阅读:
- 如何在 Linux 和 Unix 中使用 Zenity 在 Bash 脚本中创建 GUI 对话框
参考脚本
为了更熟悉 case 语句,您可以查看使用 case 语句编写的现有代码。 一个更好的起点是阅读下面的启动脚本 /etc/init.d
目录。 为了 example,我的机器上安装了virtualbox,它有一个启动文件 /etc/init.d
目录。 有一段代码是使用 case 语句编写的,可以很好地了解 case 语句的工作原理。
$ cd /etc/init.d/
$ cat bluetooth

结论
在本文中,我们了解了 Bash 中的 case 语句是什么以及使用它的不同方式。 条件语句和 case 语句都具有相同的目的。 您应该更好地了解哪种方法适合用例。 当您必须使用创建帮助函数时,也将使用案例语句 getopt
和 getopts
程式。 创建一个脚本并开始练习我们在此处提供的示例,以了解有关案例陈述的更多信息。