单分支结构
if判断也可以用(())里面用> == < 之类的判断
if [条件];then
指令
fi
或
if [条件]
then
指令
fi
案例:判断/shell/if1.sh是否存在,如果不存在则创建出来。
#!/bin/bash
file="/shell"
if [ -f "$file/if1.sh" ];then
echo "${file} OK"
fi
if [ ! -f "$file/if1.sh" ];then
[ ! -d $file ] && mkdir -p $file
[ -d $file ] && {
cd $file
touch if1.sh && echo "${file} touch OK"
}
fi
案例2: 判断系统内存大小,低于100M就进行报警
取内存剩余方法
free -m|sed -nr '3s#^.* (.*)#\1#gp'
free -m|awk 'NR==3 {print $NF}'
#!/bin/bash
FREE=`free -m|awk 'NR==3 {print $NF}'`
if [ "$FREE" -ge 100 ];then
echo "MOMERY IS $FREE OK"
[ "$FREE" -lt 100 ] && echo "MOMERY IS NO FREE"
fi
双分支结构
if [条件];then
指令
else
指令
fi
多分支结构
if [条件];then
指令
elif
then
条件
else
条件
fi
案例:生产环境监控Mysql服务的实战例子
监控Mysql服务是否正常启动,如果未正常启动则启动Mysql
思路:先要判断Mysql是否启动,可以通过端口号来判断
netstat -lnt|grep 3306|awk -F "[ :]+" '{print $5}'
#!/bin/bash
PORT=`netstat -lnt|grep 3306|awk -F "[ :]+" '{print $5}'`
if [ "$PORT" = "3306" ];then
echo "MySQL is RUNING"
else
/etc/init.d/mysqld start
fi
以上脚本测试不会报错,如果[ “$PORT” = “3306” ]写成[ P O R T − e q 3306 ] 则 为 整 数 比 较 , 在 m y s q l 没 有 启 动 的 时 候 过 滤 不 出 端 口 号 所 以 P O R T 变 量 的 值 为 空 , 空 和 一 个 整 数 比 较 会 有 报 错 , 故 此 我 们 要 把 整 数 比 较 换 为 [ " PORT -eq 3306 ]则为整数比较,在mysql没有启动的时候过滤不出端口号所以PORT变量的值为空,空和一个整数比较会有报错,故此我们要把整数比较换为[ " PORT−eq3306]则为整数比较,在mysql没有启动的时候过滤不出端口号所以PORT变量的值为空,空和一个整数比较会有报错,故此我们要把整数比较换为["PORT" = “3306” ]这样的字符比较,用””引起变成字符,再用字符比较符比对。
以上脚本有些复杂,以后判断端口可以用wc –l 来转换一下,思路是,如果端口存在则返回值为1也可能不为1(因为可能监听的IP不同),不存在则返回值必为0,因为0没有启动是不会有任何变化的,所以最好和0进行比较,如果等于0则启动,不为0则输出已经启动。利用这样的特性进行判断, [ $PORT -eq 0 ]也不用转换为字符串,因为wc –l的结果必为整数。
netstat -lnt|grep 3306|wc –l
#!/bin/bash
PORT=`netstat -lnt|grep 3306|wc -l`
if [ $PORT -eq 0 ];then
/etc/init.d/mysqld start
else
echo "MySQL is RUNING"
fi
远程监控apache服务
#!/bin/bash
HttpPort=`nmap 10.125.192.6 -p 80|grep open|wc -l`
if [ $HttpPort -eq 1 ];then
echo "httpd is runing"
else
/etc/init.d/httpd start
fi
通过url监控apache
#!/bin/bash
WgUrl=`wget -T 10 -q 10.125.192.6`
if [ $? -eq 0 ];then
echo "httpd is runing"
else
/etc/init.d/httpd start
fi
通过状态码监控web
通过状态码curl要加-s安静输出,不然取值会有问题
curl -I -s 10.125.192.6|grep 200 >/dev/null 2>&1
若用telnet检测端口需要取消交互模式
用-e参数给后面telnet命令传一个回车
echo -e “\n”|telnet baidu.com 80|grep Connected