一、条件测试操作:
要使Shell脚本程序具备-定的“智能”.面临的第一个问题就是如何区分不同的情况以确定执行何种操作。例如,当磁盘使用率超过95%时.发送告警信息;当备份目录不存在时,能够自动创建;当源码编译程序时,若配置失败则不再继续安装等。
Shell 环境根据命令执行后的返回状态值($?〉来判断是否执行成功,当返回值为0时表示成功.否则(非О值)表示失败或异常。使用专门的测试工具----test命令,可以对特定条件进行测试.并根据返回值来判断条件是否成立〈返回值为О表示条件成立).
test 条件表达式? ? 或? [ 条件表达式 ]
根据需要测试的条件类别不同.条件表达式也不同。比较常用的条件操作包括文件测试.整数值比较.字符串比较.以及针对多个条件的逻辑测试,下面分别进行介绍。
1.文件测试
文件测试指的是根据给定的路径名称.判断对应的是文件还是目录,或者判断文件是否可读.可写、可执行等。文件测试的常见操作选项如下,使用时将测试对象放在操作选项之后即可,
-d:测试是否为目录(Directory ).
-e:测试目录或文件是否存在(Exist )。
-f:测试是否为文件(File)。
-r:测试当前用户是否有权限读取〈Read)。
-w:测试当前用户是否有权限写入(Write)。
-x:测试是否设置有可执行(Excute)权限。
执行条件测试操作以后.通过预定义变量$?可以获得测试命令的返回状态值,从而判断该条件是否成立。例如,执行以下操作可测试目录/media/是否存在,如果返回值$?为0,表示存在此目录.否则表示不存在或者虽然存在但不是目录。
[root@xiao ~]# [ -d /media/ ]&& echo $?
0
?//查看前一命令的返回值,返回0表示条件成立
?若测试的条件不成立,则测试操作的返回值将不为О(通常为1)。例如,执行以下操作展示了测试不存在目录的情况。
2.整数值比较
整数值比较指的是根据给定的两个整数值,判断第--个数与第二个数的关系,如是否大于.等于、小于第二个数。整数值比较的常用操作选项如下,使用时将操作选项放在要比较的两个整数之间。
一eq:第一个数等于(Equal)第二个数。
一ne,第一个数不等于(Not Equal〉第二个数。
一gt:第--个数大于(Greater Than)第二个数。
—lt:第--个数小于(Lesser Than)第二个数。
一le:第--个数小于或等于(Lesser or Equal)第二个数。
一ge,第一个数大于或等于(Greater or Equal〉第皿个数。
整数值比较在Shell脚本编写中的应用较多。例如,用来判断已登录用户数量.开启进程数.磁盘使用率是否超标,以及软件版本号是否符合要求等。实际使用时,往往会通过变量引用、命令替换等方式来获取一个数值。
?
3.字符串比较
字符串比较通常用来检查用户输入、系统环境等是否满足条件,在提供交互式操作的Shell脚本中,也可用来判断用户输入的位置参数是否符合要求。字符串比较的常用操作选项如下。
=:第一个字符串与第二个字符串相同。
!=:第个字符串与第二个字符串不相同.其中 “!”符号表示取反。
一z:检查字符串是否为空(Zero),对于未定义或赋予空值的变量将视为空串。
4.逻辑测试
逻辑测试指的是判断两个或多个条件之间的依赖关系。当系统任务取决于多个不同的条件时,根据这些条件是否同时成立或者只要有其中一个成立等情况.需要有一个测试的过程。常用的逻辑测试操作如下,使用时放在不同的测试语句或命令之间。
&&:逻辑与,表示“而且”,只有当前后两个条件都成立时,整个测试命令的返回值才为О(结果成立)。使用test命令测试时. “&&”可改为 “—a”。
||:逻辑或.表示“或者”,只要前后两个条件中有一个成立,整个测试命令的返回值即为О(结果成立)。使用test命令测试时.“II”可改为“一o”.
!:逻辑否.表示“不”,只有当指定的条件不成立时,整个测试命令的返回值才为О(结果成立)。
二、使用if条件语句:
1.单分支if语句
if语句的“分支”指的是不同测试结果所对应的执行语句(--条或多条)。对于单分支的选择结构,只有在“条件成立”时才会执行相应的代码,否则不执行任何操作。单分支if语句的语法格式如下所示。
?2.双分支if语句
对于双分支的选择结构.要求针对“条件成立”“条件不成立”两种情况分别执行不同的操作。双分支if语句的语法格式如下所示。
?3.多分支if语句
由于if语句可以根据测试结果的成立.不成立分别执行操作.所以能够嵌套使用,进行多次判断。例如,首先判断某学生的得分是否及格.若及格则再次判断是否高于9O分等。多分支if语句的语法格式如下。
三、实验:
3.1需求描述
编写名为 sysmon. sh 的Shell监控脚本。
[root@xiao ~]# vim sysmon.sh
监控内容包括CPU使用率.内存使用率、根分区的磁盘占用率。
[root@xiao ~]# mpstat | grep "all" | awk '{print $12}' ##cup使用率
[root@xiao ~]# cpu=$(mpstat | grep "all" | awk '{print $12}')
[root@xiao ~]# free -m | grep "Mem:" | awk '{print $3}' ##使用内存
[root@xiao ~]# bbb=$( free -m | grep "Mem: " | awk '{print $2}') ##总内存
[root@xiao ~]# ccc=`expr $bbb / $aaa`
cipan=$(df -h | grep "/$" | awk '{print $5}' | awk -F% '{print $1}') ##磁盘使用率
百分比只需精确到个位.如7%、12%、23%等,
出现以下任一-情况时告警:磁盘占用率超过90%、CPU使用率超过80%、内存使用率超过90%。
if [ $cpu -gt 20 ]
then
echo "CPU占用率:$cpu %" >> $ALOG
fi
if [ $neicun -gt 6 ]
then
echo "内存使用率:$neicun %" >> $ALOG
fi
if [ $cipan -gt 20 ]
then
echo "磁盘占用率:$cipan %" >> $ALOG
fi
告警邮件通过mail命令发送到monitor@bdqn . com。
ALOG="/mnt/alert.txt"
AMAIL="root"
结合crond服务,每半小时执行一次监控脚本。
[root@xiao ~]# crontab -e
30 * * * * /root/sysmon.sh
?
?