一、条件测试操作
Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,返回值若为0则成功,不为0则表示失败或异常。有两种专门的测试工具——"test 条件表达式"和"[ 条件表达式 ]"。这两种方式的作用完全相同。根据需要测试的条件类别不同,条件表达式也不同,比较常用的条件操作包括文件测试、整数值比较、字符串比较,以及针对多个条件的逻辑测试,下面分别介绍。
1.1 文件测试
根据给定的文件路径名称,判断对应的文件是目录还是普通文件,以及是否有读、写、执行权限等。文件测试的常见操作选项如下:
- -d:测试是否是目录;
- -e:测试文件或目录是否存在;
- -f:测试是否是普通文件;
- -r:测试指定的文件是否可读;
- -w:测试指定的文件是否可写;
- -x:测试指定的文件是否可执行。
使用示例:
[ -d /var/log/messages ] #测试/var/log/messages文件是否是目录
echo $? #获取上面的命令执行后的返回状态值
#可以于逻辑与符号一起使用,将两条命令合并为一条
[ -d /var/log/messages ] && echo "NO" #若前一条命令的状态值不为0,则不会执行后面的命令,否择则两条命令一起执行
1.2 整数值比较
用于比较给定的两个整数。有6个选项,对应比较结果的6个状态:
- -eq:等于;
- -ne:不等于;
- -gt:大于;
- -lt:小于;
- -ge:大于等于;
- -le:小于等于。
整数值的比较在Shell脚本编写中的应用较多。例如,用来判断已登录用户的数量、开启进程数、磁盘使用率是否超标,以及软件版本号是否符合要求等。使用示例:
#判断物理内存当前的磁盘缓存大小
FreeCC=$(free -m | grep "Mem:" | awk '{printf $6}')
[ $FreeCC -lt 1024 ] && echo ${FreeCC}MB
#其中free -m代表以MB为单位输出内存信息,awk '{;printf $6}'代表只显示输出信息的第6列信息
1.3 字符串比较
通常用来检查用户输入、系统环境等是否满足条件,也可以用来判断用户输入的位置参数是否符合要求。字符串比较的常用操作选项如下:
- =:两个字符串是否相等;
-
!=:两个字符串是否不相等;
-
z :字符串的长度是否为0
使用方式和数值比较类似,只是将比较符号变化以下即可。
1.4 逻辑测试
用于判断多个条件之间的依赖关系,例如必须同时满足多个条件才能执行的操作或只满足其中一个条件就可以执行的操作,使用时放在要进行逻辑测试的两个条件之间。常用的逻辑测试操作如下:
- &&:逻辑与,表示"而且"。只有当前后两个条件都成立时,整个测试命令的返回值才为 0(结果成立)。使用test命令测试时,“&&”可改为“-a”;
- ||:逻辑或,表示"或者"。只要有一个条件成立,整个测试命令的返回值即为0。使用“test”命令测试时,"||"可改为"-o"。
- !:逻辑否,表示"不"。只有当指定的条件不成立时,整个测试命令的返回值才为0。
二、if条件语句
2.1 if语句的结构
用来根据特定的条件测试结果,分别执行不同的操作。根据不同的复杂程度,if语句的选择结构可以分为三种基本类型,使用于不同的场合。
2.1.1 单分支if语句
if语句的"分支"指的是不同测试结果所对应的执行语句,只有在"条件成立"时才会执行相应的代码,否则不执行任何操作。单分支语句的格式如下:
if 条件测试操作
then
命令序列
fi
在上面的格式中,条件测试操作既可以是"[ 条件表达式 ]"语句,也可以是其他可执行的命令语句。
单分支if语句的执行流程:
2.1.2 双分支语句
多了对于条件不成立时要进行的处理,语法结构如下:
if 条件测试操作
then
命令序列1
else
命令序列2
fi
双分支if语句的执行流程:
2.1.3 多分支if语句
可以使用"elif"在if语句中添加多个条件测试操作,语法结构如下:
if 条件测试操作1
then
命令序列1
elif 条件测试操作2
then
命令序列2
elif 条件测试操作3
then
命令序列3
......
elif 条件测试操作n
thenn
命令序列n
else
命令序列n+1
fi
多分支if语句的执行流程:
二、case分支语句
2.1 case语句的结构
case主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。case分支语句的语法结构如下所示:
case 变量 in
模式1)
命令序列1
;;命令序列2
;;
......
*)
默认命令序列
esac
在上述语句结构中,关键字 case 后面跟的是“变量值”,即“$变量名”。整个分支结构包括在 case...esac 之间,中间的模式 1、模式 2、……、*对应为变量的不同取值(程序期望的取值),其中*作为通配符,可匹配任意值。case语句的执行流程为:
使用case分支语句时,有几个值得注意的特点,如下所述:
- case行尾必须为单词"in",每一模式必须以右括号")"结束。
- 双份号";;"表示命令序列的结束,若不加“;;”,则脚本会继续对后面的模式进行判断,且若后面的模式判断成功,则会继续执行后面的模式中的命令序列,不会跳出case语句。
- 模式字符串中,可以用方括号表示一个连续的范围,"[0-9]";还可以使用"|"表示或。
- 最后的"*)"表示默认模式,其中的*相当于通配符。
2.2 case语句应用示例
检查用户输入的字符类型,提示用户从键盘输入一个字符,通过 case 语句判断该字符是否为字母、数字或者其他控制字符,并给出相应的提示信息。
运行该脚本,得到的结果: