shell编程(3)
  TNZdNLJrAgNB 2023年11月02日 36 0

条件测试语句

变量测试语句:用于测试变量是否相等、是否为空、文件类型等。

格式:

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}'

说明:

  1. free -m | grep ^Mem取出Mem这行信息
  2. awk '{print $3/$2*100}'相当于
  3. 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


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: Nodejs 安装 下一篇: 操作系统概述
  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  jnZtF7Co41Wg   2023年12月11日   31   0   0 nginx客户端服务端
  YKMEHzdP8aoh   2023年11月30日   33   0   0 vimUDP
  stLBpDewCLT1   2023年12月08日   30   0   0 nginx
  jnZtF7Co41Wg   2023年12月10日   22   0   0 nginx客户端服务端NFS
  eHipUjOuzYYH   2023年12月06日   29   0   0 nginxHTTP
  eHipUjOuzYYH   2023年12月06日   26   0   0 nginx加载IPV6