条件测试语句
变量测试语句:用于测试变量是否相等、是否为空、文件类型等。
格式:
test测试条件
测试范围:整数、字符串、文件
1.字符串测试
test str1=str2 测试字符串是否相等相当于[ str1=str2 ]
test str1!=str2 测试字符串是否不相等
test str1 测试字符串是否不为空
test -n str1 测试字符串是否不为空
test -z str1 测试字符串是否为空
可用来判断服务是否运行,比如pgrep nginx
例1:检测nginx服务运行状态
[root@harbor ~]# vim check-nginx.sh
#!/bin/sh
#用途判断nginx服务是否正常运行,如没有自动启动nginx服务
#$web不为空说明nginx在运行,为空说明nginx挂了
web=`/usr/bin/pgrep nginx`
if [ "$web" != "" ]
then
echo "nginx is running."
else
echo "nginx is not running"
systemctl start nginx
fi
注:脚本中的命令最好写绝对路径,不写有时候也能运行。也可以换成检测其他服务,如:
pgrep kubelet
pgrep httpd
[root@harbor ~]# sh -x check-nginx.sh
++ /usr/bin/pgrep nginx
+ web='4848
4968
4969
4970
4971'
+ '[' '4848
4968
4969
4970
4971' '!=' '' ']'
+ echo 'nginx is running.'
nginx is running.
2.整数测试
test int1 -eq int2 测试整数是否相等相当于[ int1 -eq int2 ]
test int1 -ge int2 测试int1是否>= int2
test int1 -gt int2 测试int1是否> int2
test int1 -le int2 测试int1是否<= int2
test int1 -lt int2 测试int1是否< int2
test int1 -ne int2 测试整数是否不相等
例1:两个数比大小
[root@node1 ~]# vim test.sh
#!/bin/sh
#两个数比大小
#用法 sh test.sh 整数1 整数2
if [ $# -ne 2 ]; then
echo "Not enough parameters"
exit 0
fi
if [ $1 -eq $2 ]; then
echo "$1 equals $2"
elif [ $1 -lt $2 ]; then
echo "$1 littler than $2"
elif [ $1 -gt $2 ]; then
echo "$1 greater than $2"
fi
[root@node1 ~]# sh test.sh 1 2
1 littler than 2
[root@node1 ~]# sh test.sh 2 1
2 greater than 1
[root@node1 ~]# sh test.sh 2 2
2 equals 2
[root@node1 ~]# sh test.sh 2
Not enough parameters
例2:服务器内存告警脚本
[root@node1 ~]# free -m
total used free shared buff/cache available
Mem: 3789 776 111 191 2901 2553
Swap: 0 0 0
取内存利用率:
方法1: free -m | grep ^Mem | awk '{print $3/$2*100}'
方法2: free -m | awk 'NR==2 {print $3/$2*100}'
说明:
- free -m | grep ^Mem取出Mem这行信息
- awk '{print $3/$2*100}'相当于
- awk 'NR==2 {print $3/$2*100}' 取free -m输出信息的第2行
[root@node1 ~]# vim memory.sh
#!/usr/bin/sh
#内存利用率大于30%就告警
#用法:sh memory.sh
Mem=$(free -m | grep ^Mem | awk '{print $3/$2*100}')
if [ ${Mem%.*} -gt 30 ]
then
echo "$Mem is high"
else
echo "$Mem is ok"
fi
[root@node1 ~]# sh -x memory.sh
++ free -m
++ grep '^Mem'
++ awk '{print $3/$2*100}'
+ Mem=20.3484
+ '[' 20 -gt 30 ']'
+ echo '20.3484 is ok'
20.3484 is ok
3.文件测试
test -d file 指定文件是否为目录
test -f file 指定文件是否常规文件
test -x file 指定文件是否可执行
test -r file 指定文件是否可读
test -w file 指定文件是否可写
test -a file 指定文件是否存在
test -s file 文件的大小是否非0
test -e file检查文件是否存在
test -O file检查文件是否存在并且属于当前用户所有
test -G file检查文件是否存在并且默认组与当前用户相同
[ file1 -nt file2 ]检查file1是否比file2新
[ file1 -ot file2 ]检查file1是否比file2旧
变量测试语句一般不单独使用,一般做为if语句 的测试条件,如:
if test -d $1 then
...
fi
变量测试语句可用[]进行简化,如
test -d $1 等价于[ -d $1 ]
4.多个条件的联合
-a:逻辑与,仅当两个条件都成立时,结果为真。相当于&&
-o:逻辑或,两个条件只要有一个成立,结果为真。相当于||
例1:
[root@node1 ~]# [ 2 -gt 1 -a 3 -lt 4 ];echo $?
0
[root@node1 ~]# [[ 2 -gt 1 && 3 -lt 4 ]];echo $?
0
[root@node1 ~]# [ 2 -gt 1 -o 3 -lt 2 ];echo $?
0
[root@node1 ~]# [[ 2 -gt 1 || 3 -lt 2 ]];echo $?
0