前言:
在简单的Shell脚本程序中,各条语句将按先后顺序一次执行,从而实现批处理的自动化过程,然而,单一的顺序结构使得脚本过于机械化,难以处理更加灵活的任务。
本篇博客将介绍如何进行条件测试操作,并通过正确使用if语句,使Shell脚本具有一定的”判断“能力,以根据不同的条件来完成不同的管理任务。
一、条件测试操作
1.1 条件测试操作 1
-
test命令
-
测试特定的表达式是否成立,当条件成立,测试语句的返回值为0,否则为其他数值
格式1:test 条件表达式
格式2:[ 条件表达式 ] (中括号中的文字与左右括号间都需要空格)
[root@localhost opt]# ls
abc rh test.txt
[root@localhost opt]# test -d /opt/abc
[root@localhost opt]# echo $?
0
[root@localhost opt]# test -e /opt/abc
[root@localhost opt]# echo $?
0
[root@localhost opt]# test -f /opt/abc.txt
[root@localhost opt]# echo $?
1
[root@localhost opt]# test -f /opt/test.txt
[root@localhost opt]# echo $?
0
[root@localhost opt]# ! test -d /opt/abc
[root@localhost opt]# echo $?
1
“!” 为取反
使用$?返回0表示条件成立 返回除0之外的数字表示不成立
1.2 条件测试 2
- 文件测试
格式:
[ 操作符 文件或目录 ]
常用的测试操作符:
示例:
[root@localhost opt]# [ -w /opt/abc ]
[root@localhost opt]# echo $?
0
[root@localhost opt]# [ -x /opt/abc ]
[root@localhost opt]# echo $?
0
[root@localhost opt]# [ -r /opt/abc ]
[root@localhost opt]# echo $?
0
[root@localhost opt]# [ -r /opt/abc ] && echo "yes"
yes
以上最后一条为逻辑与的关系(而且的意思)
1.3 条件测试 3
- 整数值比较
格式:
[ 整数1 操作符 整数2 ]
常用的测试操作符:
示例:
[root@localhost opt]# [ 5 -gt 3 ]&& echo "yes"
yes
[root@localhost opt]# [ 5 -le 3 ]&& echo "yes"
[root@localhost opt]# [ 5 -ne 3 ]&& echo "yes"
yes
第二条中因为5大于3,所以输入有误,不会生成yes
数值比较的另一种用法
我们使用数据时可以通过”行“的统计来生成文件或程序的数量,然后进行数值比较来判断是否需要进行处理。
示例:
[root@localhost opt]# ps -aux | wc -l
201
[root@localhost opt]# [ `ps -aux | wc -l` -gt 50 ]&& echo "很多"
很多
同时我们也可以通过“列”的统计来生成我们需要的位置下的数值,然后设置一个标准与其进行对比大小来判断我们是否要进行处理。
示例:
[root@localhost ~]# free -m (查看空间内存)
total used free shared buff/cache available
Mem: 1823 291 1146 9 384 1335
Swap: 6143 0 6143
[root@localhost ~]# FreCC=$(free -m | grep "Mem:" | awk '{print $4}')
[root@localhost ~]# [ $FreeCC -gt 1024 ] && echo ${FreeCC}MB
1146MB
以上判断的是如果Mem 物理内存的大小大于1024MB,则我们输出第四列空闲内存的大小
1.4 条件测试操作 4
- 字符串比较
格式1:
[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式2:
[ -z 字符串]
常用的测试操作符:
实验:测试当前语言环境:
[root@localhost ~]# echo $LANG (当前语言环境)
en_US.UTF-8
[root@localhost ~]# [ $LANG != "en.US" ] && echo "Not en.US"
Not en.US
以上比较如果当前语言环境不是"en.US"则输出Not en.US
以上比较的是输入的内容
1.5 条件测试 5
- 逻辑测试
格式1 :[ 表达式1 ] 操作符 [ 表达式2 ]
格式2 :命令1 操作符 命令2
常用的测试操作符:
示例:
[root@localhost demo]# pwd
/opt/demo
[root@localhost demo]# ls
test.txt
[root@localhost demo]# [ -e /opt/demo/test.txt ] && echo "yes"
yes
二、if 语句
2.1 if语句结构
-
单分支结构:
-
双分支结构
-
多分支结构
实验示例:
需求:学校田径比赛百米赛跑,若成绩在10s内则进入决赛,然后按照性别分男子组和女子组
[root@localhost demo]# vi bisai.sh
#!/bin/bash
read -p "请输入比赛秒数:" stime
if [ $stime -le 10 ] && [ $stime -gt 0 ]
then
echo "恭喜进入决赛"
read -p "请输入你的性别:" sex
if [ $sex = "男" ]
then
echo "进入男子组"
elif [ $sex = "女" ]
then
echo "进入女子组"
else
echo "输入有误"
fi
else
echo "未进入决赛"
fi
~
[root@localhost demo]# chmod +x bisai.sh
[root@localhost demo]# ./bisai.sh
请输入比赛秒数:8
恭喜进入决赛
请输入你的性别:男
进入男子组
[root@localhost demo]# ./bisai.sh
请输入比赛秒数:7
恭喜进入决赛
请输入你的性别:nan
输入有误
以上通过if语句的嵌套来完成需求
总结:
我们在写 if 条件语句的脚本时,要观察需求中有几条分支选项。然后我们在使用if语句进行处理时,要选好比较、判断的标准。
在使用多条嵌套语句来完成需求的时候,我们要可以先把 “if” 和 “fi” 写好,以免写完脚本因为漏写 fi 而导致脚本报错或无法执行。
在写完脚本后,如果要使用./来执行语句时,要注意先授予脚本执行权限。