目录
前言
条件语句是用来判断给定的条件是否满足(表达式值是否为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