一.条件测试相关语句
Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0(真true)时表示成功,返回值为非0值(假false)时表示失败或异常。
test 命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立($?返回值为 0 表示条件成立)。
格式一:test 条件表达式
格式二:[ 条件表达式 ] #方括号“[”或“]”与条件表达式之间需要至少一个空格进行分隔
(1)文件测试
test命令
- test 条件格式表达式
- [ 条件表达式 ]
[root@localhost /]# test 7 = 10
[root@localhost /]# echo $?
1
[root@localhost /]# test 7 = 7
[root@localhost /]# echo $?
0
[root@localhost /]# [ 7 = 7 ]
[root@localhost /]# echo $?
0
[root@localhost /]# [ 7 = 13 ]
[root@localhost /]# echo $?
1
【中括号和运算符号两边都得有空格,若成立返回0,否则返回其他数值】
文件测试
- 常用的测试操作符
- 格式:[ 操作符 文件或目录 ] (不要忘记空格)
操作符 | 说明 |
---|---|
-d | 测试是否为目录,且测试该文件是否存在(Directory) |
-e | 测试是否为文件,且测试该文件是否存在(File) |
-f | 测试该目录或文件是否存在(Exist) |
-r | 测试当前用户是否有权限读取(Read) |
-w | 测试当前用户是否有权限写入(Write) |
-x | 测试当前用户是否有执行权限(eXcute) |
[root@localhost]# touch wj //创建一个文件
[root@localhost]# mkdir ml //创建一个目录
[root@localhost]# ls
ml wj
[root@localhost]# [ -d ml ] && echo 有 //测试ml是否为目录,"&&"而且通过echo输出结果“有”
有
[root@localhost]# [ -d wj ]
[root@localhost]# echo $?
1
[root@localhost]$ ls -l
总用量 0
drwxr-xr-x. 2 root root 12 5月 4 18:57 ml
--w-------. 1 root root 12 5月 4 18:57 wj
[root@localhost]$ [ -r wj ]
[root@localhost]$ echo $?
1
[root@localhost]$ [ -x wj ]
[root@localhost]$ echo $?
1
//从上方ls可以看出wj文件没有r和x权限,所以返回的值为1
(2)整数值比较
格式:[ 整数1 操作符 整数2 ]
操作符 | 说明 |
---|---|
-eq | 等于(Equal) |
-ne | 不等于(Not Equal) |
-gt | 大于(Greter Than) |
-lt | 小于(Lesser Than) |
-ge | 大于等于(Lesser or Equal) |
-le | 小于等于(Greater or Equal) |
[root@localhost ~]# Free=`free -m | grep "Mem:" | awk '{print $4}'`
【通过grep检索出包含“Men:”的指定字符串并通过awk工具提取出所需的数据。最终使用反撇号提取该命令执行后的输出结果赋值给Free】
[root@localhost ~]# echo $Free
86
[root@localhost ~]# [ $Free -lt 2048 ] && echo ${Free}M
【Free变量获取出的结果如果小于等于2048则输出变量Free的值,单位为“M”】
86M
(3)字符串与逻辑比较
字符串测试
格式1:
[ 字符串1 = 字符串2 ] 或 [ 字符串1 == 字符串2 ] #表示字符串1跟字符串2相同
[ 字符串1 != 字符串2 ] # 表示字符串1跟字符串2 不同格式2:
[ -z 字符串 ] #检查字符串是否为空(Zero),对于未定义或赋予空值的变量将视为空串
[ -n 字符串 ] #检查是否有字符串存在
操作符 | 说明 |
---|---|
= | 字符串内容相同 |
!= | 字符串内容不同,!表示取反的意思 |
-z | 字符串内容为空 未定义或者赋予空值的变量将视为空串 |
-n | 是否有字符串 |
[root@localhost etc]# read -p "今天天气好不好?好/不好" abc
[root@localhost ~]# [ $abc = 好 ] && echo "今天天气好"
今天天气好
[root@localhost ~]# [ $abc = 不好 ] && echo "今天天气不好"
今天天气不好
[比较中括号内与后面双引号的两个字符串,如果一致就输出结果,不一致就不输出]
逻辑测试
格式1:[ 表达式1 ] 操作符 [ 表达式2 ]
格式2:[命令1 操作符 命令2]
在同一个[] 中括号内,使用-a -o ,不同的[]中括号,需要使用&&、||
常用的操作符:
-a或&& :逻辑与,“而且”的意思,前后条件需都成立
-o或|| :逻辑或,“或者”的意思,只需前后条件中一个成立
! :逻辑否
[root@localhost ~]# [ $a -ne 1 ] && [ $a != 3 ] 【在两个[]之间用&&或者||】
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ $a -ne 1 -a $a != 2 ] 【在同一个[]之间用-a 或者 -o】
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ 2 -lt 3 ]] && echo yes || no
yes
【因为2小于3的条件成立,且||操作符是第一个条件成立则echo输出第一个值,所以是yes】
[root@localhost ~]# [[ 2 -gt 3 ]] && echo yes || echo no
no
【因为2大于3的条件未成立,所以&&操作符不成立,从而导致echo无法输出“yes”,所以||操作符后面的“no”将被echo输出】
[root@localhost ~]# [ 2 -gt 3 ] && echo yes || echo no && echo pass
no
pass
【因为2大于3的条件未成立,所以&&操作符不成立,从而导致echo无法输出“yes”,所以||操作符后面的“no”将被echo输出,所以第二个&&两边条件
都成立,故而pass会被echo输出】
if语句
if单分支语句
举例:
[root@localhost ~]# if [ 5 -gt 3 ]
> then
> echo "ok"
> fi
ok
[root@localhost ~]# if [ 3 -gt 2 ]; then echo "ok"; fi
ok
[root@localhost ~]# [ 4 -gt 6 ] && echo "ok"
ok
【单分支if语句中&&也实现简单的if语句判断】
if双分支语句
[root@localhost ~]# cat text.sh
#!/bin/bash
netstat -natp | grep ":80" &> /dev/null 【检测80端口网络通信情况,并把数据丢入黑洞】
if [ $? -eq 0 ] 【执行$?等于0条件表达式】
then 【如果$?等于0条件成立则输出“httpd服务正在运行中”结果】
echo "httpd服务正在运行中"
else 【如果$?等于0条件不成立则输出“httpd服务未在运行,请启动该服务”结果】
echo "htppd服务未在运行,请启动该服务"
fi
--------------------------------------------
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# ./text.sh
httpd服务正在运行中
[root@localhost ~]# systemctl stop httpd
httpd服务未在运行,请启动该服务
if多分支语句、
[root@localhost ~]# cat text1.sh
#!/bin/bash
read -p "输入你的分数:" score 【使用read -p命令把键盘输入的值赋值给score变量】
if [ $score -ge 95 -a $score -le 100 ]
then
echo "你的分数为:${score},真棒!"
elif [ $score -ge 80 ] && [ $score -lt 95 ];then
echo "你的分数为:${score},请再接再厉!"
elif [[ $score -lt 70 && $score -ge 0 ]];then
echo “你的分数为:${score} ,不及格!”
else
echo "输入有误,请重新输入!"
fi
-------------------------------------------
[root@localhost ~]# chmod +x text1.sh
[root@localhost ~]# ./text1.sh
输入你的分数:69
“你的分数为:69 ,不及格!”
[root@localhost ~]# ./text1.sh
输入你的分数:99
你的分数为:99,真棒!
[root@localhost ~]# ./text1.sh
输入你的分数:0
“你的分数为:0 ,不及格!”
[root@localhost ~]# ./text1.sh
输入你的分数:81
你的分数为:81,请再接再厉!
[root@localhost ~]# ./text1.sh
输入你的分数:qwd
输入有误,请重新输入!
case分支语句
[root@localhost ~]# vim text1.sh
#!/bin/bash
read -p "输入你的分数:" score
[ $score -ge 85 -a $score -le 100 ] && a="great"
[ $score -ge 70 -a $score -le 84 ] && a="good"
[ $score -ge 0 -a $score -le 69 ] && a="false"
case $a in
great)
echo "你的分数为:${score},真棒!"
;;
good)
echo "你的分数为:${score},请再接再厉!"
;;
false)
echo “你的分数为:${score} ,不及格!”
;;
*)
echo "输入有误,请重新输入!"
esac
-----------------------------------
[root@localhost ~]# ./text1.sh
输入你的分数:100
你的分数为:100,真棒!
[root@localhost ~]# ./text1.sh
输入你的分数:70
你的分数为:70,请再接再厉!
[root@localhost ~]# ./text1.sh
输入你的分数:0
“你的分数为:0 ,不及格!”
[root@localhost ~]# ./text1.sh
输入你的分数:acd
“输入有误,请重新输入!”