Shell—编程之条件语句(test条件测试、if语句、case语句;硬盘报警项目)

前言

条件语句是用来判断给定的条件是否满足(表达式值是否为0),并根据判断的结果(真或假)决定执行的语句,选择结构就是用条件语句来实现的。
条件语句可以给定一个判断条件,并在程序执行过程中判断该条件是否成立,根据判断结果执行不同的操作,从而改变代码的执行顺序,实现更多的功能。

一、条件测试

1.1 文件测试

test命令
测试表达式是否成立,若成立返回0,否则返回其他数值

格式1: test 操作符 文件或目录
格式2:[ 操作符 文件或目录 ]
检查是否成立:echo $?

常用的测试操作符
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(eXcute)

例:a为文件

[ root@server2 ~]# test -f a
[root@server2 ~]# echo $?
0
[root@server2 ~]# test -d a
[ root@server2 ~]# echo $?
1
[ root@server2 ~]# [ -f a ]
[ root@server2 ~]# echo $?
0
[ root@server2 ~]# [ -e ab ]
[root@server2 ~]# echo $?
1

1.2 整数测试

整数值比较

格式:[ 整数1 操作符 整数2 ]

常用的测试操作符
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or Equal)
例:

[ root@server2 ~]# [ 1 -gt 2 ] && echo “true” #1大于2显示"true"
[ root@server2 ~]# [ 1 -it 2 ] && echo “true” ##1小于2显示"true"
true

1.3 字符串测试

字符串比较

格式1:
[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式2:[ -z 字符串 ]

常用的测试操作符
=:字符串内容相同
!=:字符串内容不同,!号表示相反的意思
-z:字符串内容为空

例:

[root@server2 ~]# [ 'a' = 'b’] && echo "a不等于b"
[root@server2 ~]# [ 'a' != 'b'] && echo "a不等于b"
a不等于b
[ root@server2 ~]#[ -z '' ] && echo "空"

1.4 逻辑测试

格式1:[ 表达式1 ] 操作符 [ 表达式2 ] …
格式2: 命令1 操作符 命令2 …

常用的测试操作符
-a或&&:逻辑与,“而且”的意思
-o或||:逻辑或,“或者”的意思
!:逻辑否

例1:

[ root@server2 ~]# [ -d /etc ] && [ -r /etc ] && echo "You can open it"  
 #/etc是目录,且有权读取,就输出"You can open it"显示
[ root@server2 ~]# [-d /etc ] ll [ -d /home ] && echo "ok“
 #/etc是目录,或者/home是目录就输出"ok“显示

例2:

[ root@server2 ~]# read -p "是否覆盖现有内容? (yes/no):" ack
是否覆盖现有内容? (yes/no):yes
[ root@server2 ~]# [ $ack = "yes" ] && echo “覆盖"
覆盖
[ root@server2 ~]#[ $ack = "no"] && echo "不覆盖"    #ack现在变量是yes,所以不显示不覆盖
[ root@server2 ~]# read -p "是否覆盖现有内容? (yes/no):" ack
是否覆盖现有内容? (yes/no ):no            #ack的变量成了no
[ root@server2 ~]# [ $ack = "no" ] && echo "不覆盖"       #ack=no,不覆盖显示
不覆盖

二、if语句

2.1 if单分支语句

单分支结构
格式:
if 条件测试操作
then 命令序列
fi

例:

[ root@server2 ~]# vi mkdir.shl     #创文件
#!/bin/bash     
# 创建目录
dir="/a/b"           #定义一个变量
if [ ! -d $dir ]        #/a/b是不是目录 !取反,/a/b不是目录
      then mkdir -p $dir        #然后递归创建$dir变量/a/b
fi    #结束

2.2 if双分支语句

双分支结构
格式:
if 条件测试操作
then 命令序列1
else 命令序列2
fi

例:

[ root@server2 ~]# vi tianqi.sh
#! / bin/ bash
# 天气
read -p "天气" weather     #定义变量
if [ "$weather" =“天晴" ]
then echo "好天气"
else
echo "今天可能需要带伞"
fi
[ root@server2 ~]# chmod +x tianqi.sh   #添加执行权限
[ root@server2 ~]# ./tianqi.sh
天气天晴
好天气
[ root@server2 ~]# ./tianqi.sh
天气123
今天可能需要带伞

2.3 if多分支语句

多分支结构 #可多个elif,多个条件测试
格式:
if 条件测试操作1
then 命令序列1
elif 条件测试操作2
then 命令序列2
else
命令序列3
fi

例:

[ root@server2 ~]# vi grade.sh
#!/bin/ bash
# 成绩判断     #脚本描述
read -p "您的成绩为:" grade
if [ $grade -gt 100 ] || [ $grade -lt 0 ]      #大于100或小于0
then echo “输入错误,请重新输入0-100间数值"
elif [ $grade -ge 85 ] &&[ $grade -le 100 ]     #大于等于85,小于等于100
then echo "优秀! ! ! “
elif [ $grade -ge 70 ] && [ $grade -le 84 ]       #大于等于70,小于等于84
then echo “良好! ! ! "
elif [ $grade -ge 60 ] &&[ $grade -le 69 ]       #大于等于50,小于等于69
then echo “合格! ! !"
else echo “不合格! ! !"             #其他
fi
[ root@server2 ~]# chmod +x grade.sh    #增加可执行权限
[ root@server2 ~]# ./grade.sh
您的成绩为:102
输入错误,请重新输入0-100间数值
[root@server2 ~]# ./grade. sh
您的成绩为:-2
输入错误,请重新输入0-100间数值
[ root@server2 ~]# ./grade.sh
您的成绩为:60
合格! ! !
[root@server2 ~]# ./grade. sh
您的成绩为:75
良好! ! !
[ root@server2 ~]# ./grade.sh
您的成绩为:92
优秀! ! !
[ root@server2 ~]# ./grade. sh您的成绩为:59
不合格! ! !

三、case分支语句

case多分支结构
格式:
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;

默认命令序列
esac

例1:

[ root@server2 ~]# vi case.sh
# !/ bin/ bash
# 判断输入的字符是哪种类型
read -p "请输入一个字符并按enter回车确认"key
case "$key" in
    [a-z]|[A-Z])
        echo "您输入的是字母."
    ;;
    [0-9])
        echo "您输入的是数字."
    ;;
    *) 
     echo "您输入的是空格、功能键、其他控制字符."
esac
[ root@server2 ~]# chmod +x case.sh 
[root@server2 ~]# ./ case.sh
请输入一个字符并按enter回车确认a
您输入的是字母.

例2:

[ root@server2 ~]# vi case2.sh
#!/ bin/ bash
# 成绩输入判断
read -p "成绩:" c
case "$c" in
    100)
        echo "满分"
    ;;
    9[0-9])
        echo "优秀"
    ;;
    8[0-9])
        echo “良"
    ;;
    7[0-9])
        echo “良好"
    ;;
    6[0-9])
        echo "合格"
    ;;
    *)
        echo "不合格"
esac
[ root@server2 ~]#chmod +x case2.sh   
[ root@server2 ~]# ./ case2.sh
成绩:100
满分
[ root@server2 ~]# ./case2.sh
成绩:92
优秀
[ root@server2 ~]# ./ case2.sh
成绩:82

四、硬盘报警项目

[ root@server2~]# rpm -qa mailx     #查看是否安装邮件软件
[ root@server2~]# yum -y install mailx    #如未安装需要安装软件
mailx-12.5-16.el7.x86_64
[ root@server2 ~]# vi /etc/mail.rc        #编辑配置文件   
set from=xxxxxxxxx@qq.com       #末尾行添加,定义从哪个邮箱发送
set smtp=smtp.qq. com                   #邮箱smtp域名
set smtp-auth-user=xxxxxxxxxx@qq.com    #邮件发送时登录帐号
set smtp-auth-password=xxxxxxxxxxx   #第三方软件登录授权码
set smtp-auth=login       #处于登录状态
[root@server2 ~]# echo "123123" mail -s "test" xxxxxxxxx@qq. com
 #“test”主题发送给邮箱,内容123123,登邮箱查看是否能收到邮件,前提客户机能上网

[ root@server2 ~]# vim alert.sh 
#!/bin/bash
# 硬件巡检,对cpu、内存、磁盘超过阈值报警
disk=$(df -Th | grep "/$" | awk '{print $6}' | awk -F% '{print $1}')         #磁盘
mem=$(expr $(free | grep "Mem:" | awk '{print $3}') \* 100  / $(free | grep "Mem:" | awk '{print $2}'))  #内存
cpu=$(expr 100 - $(mpstat | tail -1 | awk '{print $12}' | awk -F. '{print $1}'))       #cpu
alert_file=/root/alert.txt      #文件路径
mailbox=xxxxxx@qq.com
if [ $disk -ge 10 ]
then echo "磁盘占有率超过10%" >> $alert_file
fi
if [ $mem -ge 5 ]
then echo "内存占有率超过5%" >> $alert_file
fi
if [ $cpu -ge 2 ]
then echo "cpu占有率超过2%" >> $alert_file
fi
if [ -f $alert_file ]
then
cat $alert_file | mail -s "alert report" $mailbox    #主题"alert report"到$mailbox里去
rm -rf $alert_file    #清空
fi
[ root@server2 ~]#chmod +x alert.sh     #提权
[root@server2 ~]# ./alert.sh
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值