Bash 脚本 – 案例陈述
当必须针对多个选择做出决定时,使用 bash 脚本中的 case语句。换句话说,当表达式可能有多个值时,它很有用。这种方法可以看作是脚本中多个 if 语句的替代品。 Case 语句优于 if 语句,因为它提高了代码的可读性并且更易于维护。 Bash 脚本中的 Case 语句与 C 语言中的 Case 语句非常相似。但与 C 不同的是,Bash Case 语句在匹配发生后立即停止继续搜索。简而言之,它们不需要任何强制在 C 中使用的 break 语句来停止进一步搜索模式。
case 语句的基本语法如下所示,
句法:
case EXPRESSION in
Pattern_Case_1)
STATEMENTS
;;
Pattern_Case_1)
STATEMENTS
;;
Pattern_Case_N)
STATEMENTS
;;
*)
STATEMENTS
;;
esac
- case 语句以 case 关键字开头,后跟一个表达式和in关键字。
- 它以esac关键字结尾。
- 多个模式案例可以使用 | 分隔运算符。
- 右括号运算符')' 用于结束模式案例列表。
- 模式案例可以包含特殊字符。
- 模式案例及其主体称为子句。
- 模式案例主体必须后跟;;。
- 如果一个表达式与两个模式 case 匹配,那么在这种情况下,与表达式匹配的第一个匹配模式 case 对应的主体将被执行。
- 就像 C 为 default 语句提供了 default 关键字,同样在 Bash case 语句中,我们可以使用通配符星号 (*) 并定义最终模式 case 来定义 default case。
- 如果没有匹配的模式,则返回状态为零。否则,返回状态是匹配模式案例的执行主体的退出状态。
示例 1:输出每个选项的描述
在这个例子中,一个脚本允许用户选择一个部门,并在 echo 命令的帮助下显示与输入相对应的描述。在此脚本中,我们将 DEPARTMENT 变量指定为“计算机科学”。因此,第一个模式案例的主体被执行。
您可以按照以下说明进行操作:
1. 打开终端(Ctrl + Alt + T)并创建脚本:
department.sh
2. 将这些语句添加到脚本中:
#!/bin/bash
DEPARTMENT="Computer Science"
echo -n "Your DEPARTMENT is "
case $DEPARTMENT in
"Computer Science")
echo -n "Computer Science"
;;
"Electrical and Electronics Engineering" | "Electrical Engineering")
echo -n "Electrical and Electronics Engineering or Electrical Engineering"
;;
"Information Technology" | "Electronics and Communication")
echo -n "Information Technology or Electronics and Communication"
;;
*)
echo -n "Invalid"
;;
esac
3. 每一行描述如下:
- 脚本的第一行以 shebang (#!) 开头。
- 它指示操作系统使用特定的解释器来解析脚本。
- 我们已将 DEPARTMENT 变量初始化为“计算机科学”。
- 现在,我们使用 case 语句。
- 每个表达式都通过 case 语句处理。
- 最后一行 esac 用于终止 case 语句。
4. 保存脚本。
5. 运行脚本。
./department.sh
输出:
示例 2:使用多个模式案例
在每个子句中,我们可以使用多个模式案例。如果表达式与至少一个模式案例匹配,则执行该子句的主体。在此脚本中,我们将 DEPARTMENT 变量指定为“电子和通信”。第三种模式案例有两个由竖线 (|)运算符分隔的值。因此,第三个模式案例的主体被执行。
您可以按照以下说明进行操作:
1. 打开终端(Ctrl + Alt + T)并创建脚本:
department.sh
2. 将这些语句添加到脚本中:
#!/bin/bash
DEPARTMENT="Electronics and Communication"
echo -n "Your DEPARTMENT is "
case $DEPARTMENT in
"Computer Science")
echo -n "Computer Science"
;;
"Electrical and Electronics Engineering" | "Electrical Engineering")
echo -n "Electrical and Electronics Engineering or Electrical Engineering"
;;
"Information Technology" | "Electronics and Communication")
echo -n "Information Technology or Electronics and Communication"
;;
*)
echo -n "Invalid"
;;
esac
3. 下面对每一行进行了讨论:
- 脚本的第一行以 shebang (#!) 开头。
- 它指示操作系统使用特定的解释器来解析脚本。
- 我们已经将 DEPARTMENT 变量初始化为“Electronics and Communication”。
- 现在,我们使用 case 语句。
- 每个表达式都通过 case 语句处理。
- 最后一行 esac 用于终止 case 语句。
4. 保存脚本。
5. 运行脚本。
./department.sh
输出:
3. 保存脚本。
5. 运行脚本。
./department.sh
示例 3:for 循环
在这个脚本中,我们在数组 DEPARTMENT 中分配了一个班级的三个学生的部门。换句话说,我们将处理多个在 DEPARTMENT 变量中描述的表达式。要遍历多个表达式,我们可以使用 for 循环。
您可以按照以下说明进行操作:
1. 打开终端(Ctrl + Alt + T)并创建脚本:
department.sh
2. 将这些语句添加到脚本中:
#!/bin/bash
DEPARTMENT=("Electronics and Communication", "Computer Science", "Information Technology")
for value in "${DEPARTMENT[@]}"
do
case $value in
"Computer Science")
echo -n "Computer Science "
;;
"Electrical and Electronics Engineering" | "Electrical Engineering")
echo -n "Electrical and Electronics Engineering or Electrical Engineering "
;;
"Information Technology" | "Electronics and Communication")
echo -n "Information Technology or Electronics and Communication "
;;
*)
echo -n "Invalid "
;;
esac
done
3. 每一行描述如下:
- 脚本的第一行以 shebang (#!) 开头。
- 它指示操作系统使用特定的解释器来解析脚本。
- 我们已经用三个字符串字面量初始化了一个数组 DEPARTMENT 。
- 现在,在 for 循环的帮助下,我们正在遍历元素数组。
- 每个表达式都通过 case 语句处理。
- 最后一行 esac 用于终止 case 语句。
4. 保存脚本。
5. 运行脚本。
./department.sh
输出:
示例 4:使用“是”或“否”提示用户
您可以按照以下说明进行操作:
1. 打开终端(Ctrl + Alt + T)并创建脚本:
student.sh
2. 将这些语句添加到脚本中:
#!/bin/bash
echo -n "Are you a student? [yes or no]: "
read response
case $response in
"Y" | "y" | "YES" | "Yes" | "yes")
echo -n "Yes, I am a student."
;;
"N" | "n" | "No" | "NO" | "no" | "nO")
echo -n "No, I am not a student.";
;;
*) echo -n "Invalid input"
;;
esac
3. 每一行解释如下:
- 脚本的第一行以 shebang (#!) 开头。
- 它指示操作系统使用特定的解释器来解析脚本。
- 提示用户“你是学生吗? [是还是不是]”。
- 现在用户通过键盘给出响应。
- 响应的输出已通过 case 语句处理。
- 最后一行 esac 用于终止 case 语句。
4. 保存脚本。
5. 使用以下命令运行脚本。
./student.sh
输出:
示例 5:向进程发送信号
您可以按照以下说明进行操作:
1. 打开终端(Ctrl + Alt + T)并创建脚本:
signals.sh
2. 将这些语句添加到脚本中:
#!/bin/bash
if [ $# -lt 2 ]
then
echo "Usage : $0 Signalnumber PID"
exit
fi
# Case statement
# Signal number (expression)
case "$1" in
1) echo "Sending SIGHUP signal....."
kill -SIGHUP $2
;;
2) echo "Sending SIGINT signal....."
kill -SIGINT $2
;;
3) echo "Sending SIGQUIT signal....."
kill -SIGQUIT $2
;;
4) echo "Sending SIGKILL signals....."
kill -SIGKILL $2
;;
*) echo "Signal number $1 has not been processed"
;;
esac
3. 每一行解释如下:
- $1 是信号编号,$2 是进程 ID。
- 要向给定的进程 ID 传递或发送信号,我们使用 kill 命令。
- 这将运行 sleep 命令几秒钟。
- 可选的最后一个比较 *) 的主体将在默认情况下执行。
4. 保存脚本。
5. 使用以下命令运行脚本。
./signals.sh
输出:
$ sleep 10000
$ ps -a | grep sleep
23277 pts/2 00:00:00 sleep
$ ./signals.sh 9 31231
Sending SIGKILL signal
$ sleep 10000
Killed