2. case 命令
case 命令是根据 值 来匹配不同的多个样式中的一个,如果匹配成功,则执行样式对应的命令块。他主要用来简化 if 命令 的结构,同样可以实现多分支的执行路径。
case 命令似于 Python 语言中的 match 语句 和 C 语言中的 switch 语句。
官方语法
case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
上述 中括号([ ])内部的数据是可选的。后面跟 ... 说明前面的可选项可以有零次、一次或多次。case 命令可以写在一行内,也可以写在多行便于编写者阅读程序。
将上述一行整理成多行,并用中文表达需要填充的部分,即成为如下语法:
语法格式:
case 字符串值 in
样式1[|样式2]... )
命令块 ;;
样式3[|样式4]... )
命令块 ;;
样式1[|样式2]... )
命令块 ;;
esac
语法说明:
case、in、esac是关键字。esac是case命令结束的标记。- 右括号
)是 样式 结束的分隔符,后面是命令块。 - 两个分号
;;是命令块的终止符。 - 样式中的
|表示 或 关系,即样式1 | 样式2表示样式1或样式2中的一个匹配即可满足匹配条件。
执行顺序说明
case 命令会根据 字符串值 去下面样式列表中找寻匹配的样式,如果样式匹配成功,则执行此样式对应的命令块后结束此 case 命令的执行。
示例:
写一个 Shell 程序 test_case.sh ,此程序输入一年中的月份(1~12),打印这个月是四季:春、夏、秋、冬中的那个季节。
写入程序如下:
#!/bin/bash
read -p "请输入月份: " SEASON
case $SEASON in
1 | 2 | 3)
echo "春季!"
;;
4 | 5 | 6)
echo "夏季!"
;;
7 | 8 | 9)
echo "秋季!"
;;
10 | 11 | 12)
echo "冬季!"
;;
*)
echo "您输入的月份有误!"
;;
esac
运行结果:
weimingze@mzstudio:~$ bash test_case.sh
请输入月份: 12
冬季!
weimingze@mzstudio:~$ bash test_case.sh
请输入月份: 2
春季!
weimingze@mzstudio:~$ bash test_case.sh
请输入月份: 999
您输入的月份有误!
退出状态
case 命令的退出状态是最后执行的命令的退出状态。
练习:
写一个 Shell 脚本程序 score_range.sh 来输入一个学生的成绩等级,并输出这个等级的分数范围。
#! /bin/bash
# 输入一个学生的成绩等级(A、B、C、D),输出这个等级所在的分数范围:
# 输入 A: 输出 90-100。
# 输入 B: 输出 80-89。
# 输入 C: 输出 60-79。
# 输入 D: 输出 0-59。
# 如果输入不是上述选项,则输出 "Invalid Level!"。