shell脚本编程学习笔记-分支与循环结构
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本编程学习笔记-分支与循环结构相关的知识,希望对你有一定的参考价值。
1.1 if语句
(1)if条件语句语法:单分支结构
if [ 条件 ]
then
指令
fi
或
if [ 条件 ];then
指令
fi
if 单分支条件中文编程形象语法
如果 [ 你有房 ]
那么
我就嫁给你
果如
前面的文件条件表达式[ -f “$file1” ]&& echo 1 就相当于下面的if语句
if [ -f “$file1” ];then
echo 1
fi
(2)双分支结构
语法:
if [ 条件 ]
then
指令集1
else
指令集2
fi
上面的就相当于文件条件表达式[ -f “$file1” ]&&echo 1||echo 0
if双分支中文编程语法形象描述
如果 [ 你有房 ]
那么
我就嫁给你
否则
Goodbye
果如
(3)多分支结构
语法:
if [ 条件1 ]
then
指令1
elif [ 条件2 ]
then
指令2
else
指令3
fi
------------------------多个elif--------------------------
if [ 条件1 ]
then
指令1
elif [ 条件2 ]
then
指令2
elif [ 条件3 ]
then
指令3
………….
else
指令4
fi
多分支if语句中文编程语法形象比喻
如果 [ 你有房 ] <==有钱
那么
我就嫁给你
或者如果[ 你爸是李刚 ] <==有权
那么
我就嫁给你
或者如果[ 你很努力很吃苦 ]<==有潜力
那么
我们可以先处对象
否则
不鸟你<==遭淘汰
果如
1.2 范例
监控系统内存并报警企业案例脚本开发实战
问题:开发shell脚本判断系统声誉内存的大小,如果低于100M就邮件报警给管理员,并且加入系统定时任务每3分钟执行一次。
解答:重视问题的解决过程,第一步、第二部、第三部
实战操作:
(1)先把命令行条件取出来
[[email protected] ~]# free -m
total used free sharedbuffers cached
Mem: 981226754 0 48 57
-/+ buffers/cache:120860
Swap: 1983 0 1983
[[email protected] ~]# free -m|grep buffers\/
-/+ buffers/cache:120860
[[email protected] ~]# free -m|grep buffers\/|awk ‘ {print $NF}‘
860
[[email protected] ~]# free -m|grep buffers/|awk ‘{print $NF}‘
854
[[email protected] ~]# free -m|awk ‘NR==3 {print $NF}‘
854
(2)编写脚本
#做一个定义
cur_free=’free –m|awk ‘/buffers\// {print $NF}’’
chars=”current memory is $cur_free.”
if [ $cur_free –lt 100 ]
Then
Echo $chars|mail –s “$chars” [email protected]
fi
1.3 拓展;监控磁盘,NFS系统,mysql,WEB<--监控资源
(1)以监控磁盘为例
先读取命令行然后再判断磁盘使用率是否低于设定的值,如果低于发邮件报警。
[[email protected] ~]# df -h
filesystemSize Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
18G 816M 16G 5% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 477M 33M 419M 8% /boot
[[email protected] ~]# df -h|awk ‘NR==3 {print $3}‘
16G
(2)监控mysql服务可以查看端口存在不存在
注意:不要将端口值取出来,wc –l统计个数就完事儿了,将问题简单化。
[[email protected] ~]# netstat -lnt|grep 3306
tcp0 0 0.0.0.0:33060.0.0.0:* LISTEN
[[email protected] ~]# netstat -lnt|grep 3306|wc -l
1
1.4 实战:
用if双分支实现对apache或mysql服务是否正常判断,使用进程数、端口、URL的方式中的一种,如果进程没起动把进程启动。
(1)使用端口判断mysql
[[email protected] ~]# cat mysql.sh
#!/bin/bash
a=$(netstat -lntup|grep mysql|wc -l)
echo $a
if [ "$a" -eq "1" ];then
echo "mysql is start"
else
echo "mysql is stop.starting "
/etc/init.d/mysqld start
Fi
(2)使用端口判断apache
[[email protected] ~]# cat apache.sh
#!/bin/bash
apache=$(netstat -lntup|grep httpd|wc -l)
echo $apache
if [ "$apache" -eq "1" ];then
echo "apache is starting..."
else
echo “starting is not starting...”
/usr/local/apache/bin/apachectl start
Fi
1.5 以read读入的方式比较两个数的大小。请用read的方式实现。
[[email protected] ~]# cat read3.sh
#!?bin/bash
read -p "please input nun1 num2:" a b
if [ "$a" -eq "$b" ];then
echo "$a 等于 $b"
elif [ "$a" -gt "$b" ];then
echo "$a 大于 $b"
elif [ "$a" -lt "$b" ];then
echo "$a 小于 $b"
fi
1.6 课后作业
监控web服务是否正常,不低于5中思路
监控mysql服务是否正常,不低于5中思路。
方法:Web服务和数据库(Mysql)共同方法
(1)端口
本地:netstat/ss/lsof
远程:telnet/nmap/nc 不在一台机器上
查看远端的端口是否通畅3个简单实例案例!
http://oldboy.blog.51cto.com/2561410/942530
(2)进程(本地)ps –ef|grep mysql|wc -l
(3)wget/curl(http方式,判断数据返回值或者返回内容)
(4)header(http),(http方式,根据状态码判断)
(5)数据库特有,通过mysql客户端连接连接,根据返回值或者返回内容。
1.6.1 监控mysql服务
1.6.1.1 本地
(1)netstat –lnup|grep 3306|wc –l
注意这个端口必须是唯一的,不唯一系统上的mysql端口是多少就写多少
(2)netstat -lnt|grep 3306|awk -F "[ :]+" ‘{print $5}‘取值比较是否等于3306
(3)netstat –lntup|grep mysqld|wc –l
(4)[ "netstat -lnt|grep 3306|awk -F "[ :]+" ‘{print $5}‘
" = "3306" ]
这个是把mysql的进程取出来和3306比较如果等于3306就说明mysql服务启动不等于就是服务没启动,这个方法是最笨的不应该取出来比较应该直接用wc –l计算出个数。例如:netstat -lntup|grep mysqld|wc –l
(5)[ps -ef|grep mysql|grep -v grep|wc -l
-gt 0 ]
这里的grep –v我理解是反选的意思,因为grep mysql也会产生含mysql关键字的进程。
查看mysql进程如果是多实例的话就不要grep mysql了grep它唯一值的那个端口的名字。
(6)ss -lntup|grep 3306|wc –l
(7)lsof -i :3306|grep mysql|wc –l
没有lsof命令可以yum安装
1.6.1.2 远程查看端口
查看远端端口一般很少使用telnet,推荐使用nmap查看远端端口的open的状态查看远端端口开没开。如果没有namp用yum安装一下。端口开放服务不一定正常,端口不开服务一定不正常。所以当服务器数量比较多一般都会判断端口。生产环境中用的比较多的是nmap。
(1) nmap 192.168.1.113 -p 3306 2>/dev/null|grep open|wc –l
(2) echo -e "\n"|telnet 192.168.1.113 3306|grep Connected|wc -l
(3) nc -v -w 2 192.168.1.113 -z 3306 2>/dev/null |grep succeeded|wc –l
我们在执行nc -v -w 2 192.168.1.113 -z 3306这条命令是可能会出现这样的报错F?jHost ‘192.168.1.108‘ is not allowed to connect to this MySQL server。出现这个错误的原因是不允许远程访问mysql,所以我们要创建远程登录用户并授权。
1.6.1.3 以mysql为例综合讲解通过本地和远端查看端口
通过本地和远端查看端口判断服务的启停如果服务没有启,启动服务。一共七种方法,还涉及到了一个免秘钥登录远程主机很简单这里我就不解释了,如下图。
1.6.2 监控web服务
Mysql查看本地和远程端口的方法,web服务也同样适用。这里就不详细说明了,只说一下curl和wget两种方法。具体方法如下图。
下图为用curl监控web服务的五种方法
下图为wget监控web服务的方法
1.6.3 小结
(1)端口
本地: ss,netstat,lsof
远程: telnet,nmap,nc
echo -e "\n"|telnet 192.168.1.113 3306|grep Connected|wc –l
nmap 192.168.1.113 -p 3306 2>/dev/null|grep open|wc –l
nc -v -w 2 192.168.1.113 -z 3306 2>/dev/null |grep succeeded|wc –l
查看远端的端口是否通畅3个简单实例案例!
http://oldboy.blog.51cto.com/2561410/942530
(2)本地端口
(3)header(http code)curl –I web地址返回200就ok
curl -I -m 10 -o /dev/null -s -w "%{http_code}\n"http://192.168.1.113
掌握技术思想比解决问题本身更重要
http://oldboy.blog.51cto.com/2561410/1196298
(4) URL(wget,curl)web地址,模拟用户的方式
(5) php.java 写一个程序,模拟用户的方式监控。
以上是关于shell脚本编程学习笔记-分支与循环结构的主要内容,如果未能解决你的问题,请参考以下文章