case
文章目录
当判断条件分支较多,使用case in更方便。
语法说明
case expression in
pattern1)
statement1
;;
pattern2)
statement2
;;
pattern3)
statement3
;;
……
*)
statement
esac
- expression 是表达式,pattern 表示匹配模式。
- expression 既可以是一个变量、一个数字、一个字符串,还可以是一个数学计算表达式,或者是命令的执行返回值。
- pattern 可以是一个数字、一个字符串,甚至是一个简单的正则表达式。
- case 会将 expression 的值与 pattern1、pattern2、pattern3 逐个进行匹配:
如果和某个模式匹配成功,就会执行这模式,然后遇见双分号;;停止;然后整个 case 语句就执行完了,程序会跳出整个 case 语句。 - 如果 expression 没有匹配到任何一个模式,那么就执行*)后面的语句(*表示其它所有值),相当于多个 if 分支语句中最后的 else 部分。
- 除最后一个分支外(这个分支可以是普通分支,也可以是*)分支),其它的每个分支都必须以;;结尾,;;代表一个分支的结束,不写的话会有语法错误。
示例
[root@zaishu sh]# cat sex_comp.sh
#!/bin/bash
read -p $'输入性别:1:男人 2:女人 3:人妖 4:阴阳人 5:阉人 其它:不是人 \n' sex
case $sex in
1)
echo "男人"
;;
2)
echo "女人"
;;
3)
echo "人妖"
;;
4)
echo "阴阳人"
;;
5)
echo "阉人"
;;
*)
echo "不是人"
esac
[root@zaishu sh]# ./sex_comp.sh
输入性别:1:男人 2:女人 3:人妖 4:阴阳人 5:阉人 其它:不是人
1
男人
[root@zaishu sh]# ./sex_comp.sh
输入性别:1:男人 2:女人 3:人妖 4:阴阳人 5:阉人 其它:不是人
0
不是人
case in 和正则表达式
case in 的 pattern 部分支持简单的正则表达式,具体来说,可以使用以下几种格式:
用法 | 说明 |
---|---|
* | 表示任意字符串。 |
? | 表示单个字符 |
[abc] | 表示 a、b、c 三个字符中的任意一个。比如,[15ZH] 表示 1、5、Z、H 四个字符中的任意一个。 |
[m-n] | 表示从 m 到 n 的任意一个字符。比如,[0-9] 表示任意一个数字,[0-9a-zA-Z] 表示字母或数字。 |
| | 表示多重选择,类似逻辑运算中的或运算。比如,abc | xyz 表示匹配字符串 “abc” 或者 “xyz”。 |
之前讲解的最后一个分支*),它只是一个正则表达式,*表示任意字符串。
下面的例子演示了如何在 case in 中使用正则表达式:
#!/bin/bash
read -p $'请输入任意一个字符:' char
case $char in
[a-zA-Z])
printf "\n字母\n"
;;
[0-9])
printf "\n数字\n"
;;
[,.?!])
printf "\n特殊符号\n"
;;
*)
printf "\n其它\n"
esac
[root@zaishu sh]# ./char_c.sh
请输入任意一个字符:a
字母
[root@zaishu sh]# ./char_c.sh
请输入任意一个字符:!
特殊符号
[root@zaishu sh]# ./char_c.sh
请输入任意一个字符:3
数字
[root@zaishu sh]# ./char_c.sh
请输入任意一个字符:hulk
其它
综合案例
[root@zaishu sh]# cat yesno.sh
#!/bin/bash
#
#********************************************************************
#Author: shuge
#********************************************************************
read -p "Do you agree(yes/no)? " INPUT
case $INPUT in
[yY]|[Yy][Ee][Ss])
echo "You input is YES"
;;
[Nn]|[Nn][Oo])
echo "You input is NO"
;;
*)
echo "Input fales,please input yes or no!"
esac
[root@zaishu sh]# ./yesno.sh
Do you agree(yes/no)? y
You input is YES
[root@zaishu sh]# ./yesno.sh
Do you agree(yes/no)? Y
You input is YES
[root@zaishu sh]# ./yesno.sh
Do you agree(yes/no)? YEs
You input is YES
[root@zaishu sh]# ./yesno.sh
Do you agree(yes/no)? n
You input is NO
总结
case详解,语法说明,示例,case in 和正则表达式,综合案例