Bash 脚本 – 案例陈述

在上一篇文章中,我们已经了解了如何使用条件语句 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

解释:

  1. 关键字 "case""esac" 标记 case 语句的开始和结束。
  2. 关键字 case 后面应该跟一个 "expression". 将评估此表达式并根据模式列表搜索输出。
  3. 表达式后, "in" 关键字应该写,它指向 "value in patterns".
  4. 您可以根据需要创建任意数量的模式。 你可以把每个模式想象成一个 ifelif 条件语句中的子句。 如果从表达式计算的值与模式匹配,则该模式将运行其代码块。 剩余的花样将被跳过。
  5. 模式中的每个语句都应该以 双分号 (;;)。
  6. 与 if 语句中的 else 子句类似,在 case 语句中有一个默认模式称为 星号 (*) 如果没有任何模式匹配,它将运行它的代码块。

示例 1 – 使用 case 语句的计算器

在这个 example,我使用 case 语句创建了一个简单的计算器。 让我解释一下当你运行这段代码时会发生什么。

  1. 提示用户输入两个数字并存储在变量中 "X""Y".
  2. 提示用户输入运算类型(加、减、乘、除)并存储在变量中 “操作员”.
  3. 在case语句变量 “操作员” 被评估和不同 模式 (+,-,x,/,%) 是为不同的操作创建的。
  4. 如果模式匹配,特定模式将运行其语句,跳过 case 语句中的所有其他模式。
  5. 如果您尝试输入所需算术运算符以外的任何其他值,则默认 图案 (*) 将运行它的语句。
#!/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
具有模式匹配的 case 语句具有模式匹配的 case 语句

示例 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 语句都具有相同的目的。 您应该更好地了解哪种方法适合用例。 当您必须使用创建帮助函数时,也将使用案例语句 getoptgetopts 程式。 创建一个脚本并开始练习我们在此处提供的示例,以了解有关案例陈述的更多信息。