shell中的case in语句
1. case in 的用法
和其它编程语言类似,Shell也支持两种分支结构(选择结构),分别是if else 语句和 case in 语句。
格式:
case expression in
pattern 1)
statement1
;;
pattern 2)
statement2
;;
……
*)
statementn
esac
其中:case in 和esac都是shell关键字,expression表示表达式,pattern表示匹配模式
expression既可以是一个变量、一个数字、一个字符串,也可以是一个数学计算表达式或者命令的执行结果只要能够得到expression的值就可以。
pattern可以是一个数字、一个字符串、甚至是一个简单的正则表达式
执行过程:
- case会将expression的值与pattern1、pattern2等逐个进行匹配
- 如果expression和某个模式匹配成功,就会执行这个模式后面对应的所有语句(该语句可以有一条,也可以有多条),直到遇见双分号;;才停止,然后整个case语句就执行完毕,跳出case语句,执行esac后面的其他语句
- 如果expression没有匹配到任何一个模式,那么就执行 * )后面的语句 ( * 表示其他所有值),直到遇见双分号;;或者esac才结束。* )相当于多个if的分支语句中最后的else部分
对*) 的说明:
- case in语句中的*)用来“托底”,万一expression没有匹配到任何一个模式,*)部分可以做一些“善后”工作,或者给用户一些提示
- 可以没有*)部分,如果expression没有匹配到任何一个模式,就不执行任何操作
- 除了最后一个分支外(可以是普通分支,也可以是*)分支),其他的分支都必须以;;结尾,;;代表一个分支的结束,不写的话会有语法错误。最后一个分支可以写;;,也可以不写。因为无论如何,执行到esac都会结束整个case in语句
例:
#!/bin/bash
echo "Input integer number"
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 "error"
esac
2. case in 和正则表达式
case in 的pattern部分支持简单的正则表达式,具体来说,可以使用以下几种格式:
格式 | 说明 |
---|---|
* | 表示任意字符串 |
[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” |
例:
#!/bin/bash
echo "Input a character: "
read -n 1 char
# 如果此处需要用echo输出的话就不能用read -n 1 因为没有用户输入数据完成后是没有换行符的
# -n 1 表示只读取一个字符,运行脚本后 只要用户输入一个字符 立即读取结束 不用等用户按下回车键
# 解决方法:在echo语句中手动添加换行符
case $char in
[a-zA-Z])
echo -e "\nletter"
;;
[0-9])
echo -e "\nDigit"
;;
[.,?!])
echo -e "\nPunctuation"
;;
*)
echo -e "\nerror"
esac