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
...
esac
case、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 个字符,并按回车键确认:
.
您输入的是符号
ICP备案:
公安联网备案: