Shell case in条件语句的用法(非常详细,附带实例)
在 Shell 程序中,if 语句适合判断条件的数量少且判断条件较为复杂的场景,而当判断条件数量较多且判断条件比较简单时,使用 case in 语句就比较方便了。
if 语句和 case in 语句各自具备优势:
而且 case in 语句主要适用于某个变量存在多种取值,需要对其中的每一种取值分别执行不同操作的场景。
case in 语句的语法格式如下:
expression 的格式不固定,可以是一个变量、一个数字、一个字符串,还可以是一个数学计算表达式,或者是命令的执行结果,只要可以得到 expression 的值就行。
pattern 表示匹配模式,用于匹配 expression 中的值,它本身可以是一个数字、一个字符串或一个简单的正则表达式。“)”本身是一个关键符号,也是固定不变的。
case in 语句的执行逻辑:case 会将 expression 的值与匹配模式(pattern1~n)进行匹配,匹配顺序是从上到下依次匹配。如果 expression 和某个模式匹配成功,就会执行这个模式后面对应的所有自定义语句,直到遇见双分号“;;”才停止,case in 语句执行完毕。如果 expression 没有匹配到任何一个模式,那么就执行“*)”后面的自定义语句,直到遇见双分号“;;”才结束。“*)”相当于多分支 if 语句中的 else 关键字。
case in 语句可以没有“*)”这部分。如果没有匹配到任何一个模式,那么就不执行任何操作。
如果 expression 没有匹配到任何一个模式,那么“*)”就可以做一些善后的工作,或者给用户一些提示。除最后一个匹配模式外,其他匹配模式必须以双分号“;;”结尾,双分号“;;”表示一个匹配模式的结束,不写会导致 Shell 脚本执行报错。
匹配模式支持部分简单的正则表达式,具体见下表:
大家刚开始接触 case in 语句的格式可能会有些迷茫,毕竟与之前的if判断语句有些差别,这里通过几个案例让大家理解得更深刻一些。
【实例 1】将输入的数字 [1-7] 转换成对应的一周[周一至周日]。
【实例 2】判断输入的值是大写字母、小写字母、数字或符号中的一种。
if 语句和 case in 语句各自具备优势:
- if 语句偏向于判断较为复杂的条件,且可以嵌套使用,进行多层次判断。
- case in 语句偏向于判断条件分支较多且判断条件比较简单的场景。
而且 case in 语句主要适用于某个变量存在多种取值,需要对其中的每一种取值分别执行不同操作的场景。
case in 语句的语法格式如下:
case expression in pattern1) statement1 ... ;; pattern2) statement1 ... ;; pattern3) statement1 ... ;; *) statement1 ... esaccase、in 和 esac 是关键字,其中要注意的是开头使用的是 case,结尾用的是 esac。
expression 的格式不固定,可以是一个变量、一个数字、一个字符串,还可以是一个数学计算表达式,或者是命令的执行结果,只要可以得到 expression 的值就行。
pattern 表示匹配模式,用于匹配 expression 中的值,它本身可以是一个数字、一个字符串或一个简单的正则表达式。“)”本身是一个关键符号,也是固定不变的。
case in 语句的执行逻辑:case 会将 expression 的值与匹配模式(pattern1~n)进行匹配,匹配顺序是从上到下依次匹配。如果 expression 和某个模式匹配成功,就会执行这个模式后面对应的所有自定义语句,直到遇见双分号“;;”才停止,case in 语句执行完毕。如果 expression 没有匹配到任何一个模式,那么就执行“*)”后面的自定义语句,直到遇见双分号“;;”才结束。“*)”相当于多分支 if 语句中的 else 关键字。
case in 语句可以没有“*)”这部分。如果没有匹配到任何一个模式,那么就不执行任何操作。
如果 expression 没有匹配到任何一个模式,那么“*)”就可以做一些善后的工作,或者给用户一些提示。除最后一个匹配模式外,其他匹配模式必须以双分号“;;”结尾,双分号“;;”表示一个匹配模式的结束,不写会导致 Shell 脚本执行报错。
匹配模式支持部分简单的正则表达式,具体见下表:
格式 | 含义 |
---|---|
* | 表示任意个任意字符串 |
[abc] | 表示 a、b、c 三个字符中的任意一个。例如,[15ZH] 表示 1、5、Z、H 四个字符中的任意一个 |
[m-n] | 表示从 m 到 n 的任意一个字符。例如,[0-9] 表示 0~9 之间任意一个数字,[0-9a-zA-Z] 表示任意一个大小写字母或数字 |
| | 表示多重选择,类似逻辑运算中的或运算。例如,abc | xyz 表示匹配字符串“abc”或者“xyz” |
大家刚开始接触 case in 语句的格式可能会有些迷茫,毕竟与之前的if判断语句有些差别,这里通过几个案例让大家理解得更深刻一些。
【实例 1】将输入的数字 [1-7] 转换成对应的一周[周一至周日]。
[root@linux opt]# vim demo28.sh #!/bin/bash echo "请输入数字[1-7]: " read num case $num in 1) echo "Monday" ;; 2) echo "Tuesday" ;; 3) echo "Wednesday" ;; 4) echo "Thursday" ;; 5) echo "Friday" ;; 6) echo "Saturday" ;; 7) echo "Sunday" ;; *) echo "错误,请输入[1-7]之间的数字!" esac [root@linux opt]# bash demo28.sh 请输入数字[1-7]: 1 Monday [root@linux opt]# bash demo28.sh 请输入数字[1-7]: 7 Sunday [root@linux opt]# bash demo28.sh 请输入数字[1-7]: 5 Friday [root@linux opt]# bash demo28.sh 请输入数字[1-7]: 99 错误,请输入[1-7]之间的数字!
【实例 2】判断输入的值是大写字母、小写字母、数字或符号中的一种。
[root@linux opt]# vim demo29.sh #!/bin/bash echo "请输入一个字符,并按回车键确认:" read num case $num in [a-z]|[A-Z]) echo "您输入的是字母" ;; [0-9]) echo "您输入的是 1 个数字" ;; [0-9][0-9]) echo "您输入的是 2 个数字" ;; [0-9][0-9][0-9]) echo "您输入的是 3 个数字" ;; [,.?!]) echo "您输入的是符号" ;; *) echo "错误,您输入的值不在匹配范围内!" esac [root@linux opt]# bash demo29.sh 请输入 1 个字符,并按回车键确认: a 您输入的是字母 [root@linux opt]# bash demo29.sh 请输入 1 个字符,并按回车键确认: H 您输入的是字母 [root@linux opt]# bash demo29.sh 请输入 1 个字符,并按回车键确认: 6 您输入的是一个数字 [root@linux opt]# bash demo29.sh 请输入 1 个字符,并按回车键确认: 234 您输入的是 3 个数字 [root@linux opt]# bash demo29.sh 请输入 1 个字符,并按回车键确认: . 您输入的是符号