Shell编程之IF条件
一、if条件语句的知识与实践
1.if条件语句语法(单分支结构)
第一种:
if < 条件表达式 >
then
指令
fi
第二种:
if < 条件表达式 >; then
指令
fi
嵌套:
if < 条件表达式 >
then
if < 条件表达式 >
then
指令
fi
fi
2.多分支结构
if < 条件表达式 >
then
指令
else
指令
fi
if < 条件表达式 >
then
指令
elif < 条件表达式 >
then
指令
else
指令
fi
3.单分支实践
(1)把下面的测试文件中条件表达式语句改成if条件语句
[root@codis-178 ~]# [ -f /etc/hosts ] && echo 1
1
[root@codis-178 ~]# [[ -f /etc/hosts ]] && echo 1
1
[root@codis-178 ~]# test -f /etc/hosts && echo 1
1
[root@codis-178 ~]# cat 7_1.sh
#!/bin/bash
if [ -f /etc/hosts ]
then
echo 1
fi
if [[ -f /etc/hosts ]]
then
echo 1
fi
if test -f /etc/hosts
then
echo 1
fi
[root@codis-178 ~]# sh 7_1.sh
1
1
1
(2)判断系统剩余内存大小,若低于100MB。就邮件报警,并将脚本加入定时任务,每3分钟执行一次检查。
[root@codis-178 ~]# cat 7_2.sh
#!/bin/bash
FreeMem=`free -m|awk 'NR==3 {print $NF}'`
CHARS="Current memory is $FreeMem"
if [ $FreeMem -lt 100 ]
then
echo $CHARS|tee /tmp/messages.txt
mail -s "`date +%F-%T`$CHARS" test@oldboy.com < /tmp/messages.txt
fi
加入crontab中
# monitor sys mem at 20170802 by xiaoda
*/3 * * * * /bin/sh /data/cron/7_2.sh &>/dev/null
(3)实现整数大小的比较
[root@codis-178 ~]# cat 7_3.sh
#!/bin/bash
read -p "pls input two num:" a b
if [ $a -lt $b ];then
echo "$a < $b"
elif [ $a -gt $b ];then
echo "$a > $b"
elif [ $a -eq $b ];then
echo "$a = $b"
else
echo "Input error"
fi
[root@codis-178 ~]# sh 7_3.sh
pls input two num: 5 6
5 < 6
[root@codis-178 ~]# sh 7_3.sh
pls input two num: 8 4
8 > 4
[root@codis-178 ~]# sh 7_3.sh
pls input two num: 5 5
5 = 5
二、企业案例
1.监控Web和数据库之分析问题
2.监控方法
本地端口监控
netstat -lnt|grep 3306|awk -F "[ :]+" '{print $5}'
netstat -lntup|grep 3306 |wc -l
netstat -lntup|grep mysql|wc -l
lsof -i tcp:3306|wc -l
远程端口监控
nmap 127.0.0.1 -p 3306 |grep open |wc -l
nc -w 2 127.0.0.1 3306 &>/dev/null
服务进程或进程数监控
ps -ef|grep mysql|grep -v grep|wc -l
客户端模拟用户访问
[root@codis-178 ~]# wget --spider --timeout=10 --tries=2 www.baidu.com
Spider mode enabled. Check if remote file exists.
--2017-08-02 13:55:10-- http://www.baidu.com/
Resolving www.baidu.com... 61.135.169.125, 61.135.169.121
Connecting to www.baidu.com|61.135.169.125|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 277 [text/html]
Remote file exists and could contain further links,
but recursion is disabled -- not retrieving.
curl -s http://www.baidu.com
3.开发监控MySQL数据库的脚本
[root@codis-178 ~]# cat 7_4.sh
#!/bin/bash
echo method1--------------
if [ `netstat -lnt|grep 3306|awk -F "[ :]+" '{print $5}'` -eq 3306 ]
then
echo "MySQL is Running."
else
echo "MySQL is Stopped."
#/etc/init.d/mysqld start
fi
[root@codis-178 ~]# sh 7_4.sh
method1--------------
MySQL is Running.
[root@codis-178 ~]# cat 7_4_1.sh
#!/bin/bash
echo method2--------------
if [ `netstat -lnt|grep 3306|awk -F "[ :]+" '{print $5}'` = "3306" ]
then
echo "MySQL is Running."
else
echo "MySQL is Stopped."
#/etc/init.d/mysqld start
fi
[root@codis-178 ~]# sh 7_4_1.sh
method2--------------
MySQL is Running.
[root@codis-178 ~]# cat 7_4_2.sh
#!/bin/bash
echo method3--------------
if [ `netstat -lntup|grep mysqld|wc -l` -gt 0 ]
then
echo "MySQL is Running."
else
echo "MySQL is Stopped."
#/etc/init.d/mysqld start
fi
[root@codis-178 ~]# sh 7_4_2.sh
method3--------------
MySQL is Running.
[root@codis-178 ~]# cat 7_4_3.sh
#!/bin/bash
echo method4--------------
if [ `lsof -i tcp:3306|wc -l` -gt 0 ]
then
echo "MySQL is Running."
else
echo "MySQL is Stopped."
#/etc/init.d/mysqld start
fi
[root@codis-178 ~]# sh 7_4_3.sh
method4--------------
MySQL is Running.
4.监控Nginx Web服务异常
[root@codis-178 ~]# netstat -lnt|grep -w 8081|awk -F "[ :]+" '{print $5}'
8081
[root@codis-178 ~]# netstat -lntup|grep -w 8081|wc -l
1
[root@codis-178 ~]# lsof -i tcp:8081|wc -l
4
[root@codis-178 ~]# ps -ef |grep nginx|grep -v grep|wc -l
3
[root@codis-178 ~]# ps -C nginx --no-header
10869 ? 00:00:00 nginx
10870 ? 00:10:55 nginx
10871 ? 00:07:43 nginx
[root@codis-178 ~]# ps -C nginx --no-header|wc -l
3
5.开发监控Nginx Web服务的脚本
[root@codis-178 ~]# cat 7_5.sh
#!/bin/bash
echo http method1---------------
if [ `netstat -lnt|grep 8081|awk -F "[ :]+" '{print $5}'` -eq 8081 ]
then
echo "Nginx is Running."
else
echo "Nginx is Stoped."
fi
[root@codis-178 ~]# sh 7_5.sh
http method1---------------
Nginx is Running.
[root@codis-178 ~]# cat 7_5_1.sh
#!/bin/bash
echo http method1---------------
if [ `netstat -lnt|grep 8081|awk -F "[ :]+" '{print $5}'` = "8081" ]
then
echo "Nginx is Running."
else
echo "Nginx is Stoped."
fi
[root@codis-178 ~]# sh 7_5_1.sh
http method1---------------
Nginx is Running.
[root@codis-178 ~]# cat 7_5_2.sh
#!/bin/bash
echo http method2---------------
if [ `netstat -lntup|grep nginx|wc -l` -gt 0 ]
then
echo "Nginx is Running."
else
echo "Nginx is Stoped."
fi
[root@codis-178 ~]# sh 7_5_2.sh
http method2---------------
Nginx is Running.
三、经典案例
1.比较两个整数
[root@codis-178 ~]# cat 7_6.sh
#!/bin/bash
read -p "pls input two num:" a b
expr $a + 10 &>/dev/null
RETVAL1=$?
expr $b + 10 &>/dev/null
RETVAL2=$?
if [ -z "$a" ] || [ -z "$b" ]
then
echo "Pls input two num agin."
exit 1
elif test $RETVAL1 -ne 0 -o $RETVAL2 -ne 0
then
echo "Pls input two "num" again."
exit 2
elif [ $a -lt $b ]
then
echo "$a < $b"
elif [ $a -eq $b ]
then
echo "$a = $b"
else
echo "$a > $b"
fi
[root@codis-178 ~]# sh 7_6.sh
pls input two num: 6 9
6 < 9
[root@codis-178 ~]# sh 7_6.sh
pls input two num: 8 2
8 > 2
[root@codis-178 ~]# sh 7_6.sh
pls input two num: 7 7
7 = 7
2.判断字符串是否为数字
思路1:删除字符串中的所有数字,看长度是否为0
[root@codis-178 ~]# [ -n "`echo oldboy123|sed 's/[0-9]//g'`" ] && echo char ||echo int
char
[root@codis-178 ~]# [ -n "`echo 123|sed 's/[0-9]//g'`" ] && echo char ||echo int
int
[root@codis-178 ~]# [ -z "`echo 123|sed 's/[0-9]//g'`" ] && echo char ||echo int
char
[root@codis-178 ~]# [ -z "`echo 123|sed 's/[0-9]//g'`" ] && echo int ||echo char
int
[root@codis-178 ~]# [ -z "`echo oldboy123|sed 's/[0-9]//g'`" ] && echo int ||echo char
char
思路2:如果num的长度不为0,并且把num中的非数字部分删除,然后再看结果是不是等于num本身,如果两者都成立,则num是数字
[root@codis-178 ~]# num=521
[root@codis-178 ~]# [ -n "$num" -a "$num" = "${num//[^0-9]/}" ] && echo "it is num"
it is num
[root@codis-178 ~]# num=oldboy521
[root@codis-178 ~]# [ -n "$num" -a "$num" = "${num//[^0-9]/}" ] && echo "it is num"
[root@codis-178 ~]#
思路3:通过expr计算判断
[root@codis-178 ~]# expr pldboy + 1 &>/dev/null
[root@codis-178 ~]# echo $?
2
[root@codis-178 ~]# expr 123 + 1 &>/dev/null
[root@codis-178 ~]# echo $?
0
[root@codis-178 ~]# expr 0 + 0 &>/dev/null
[root@codis-178 ~]# echo $?
1
思路4:利用“=~”符号判断
[root@codis-178 ~]# [[ oldboy123 =~ ^[0-9]+$ ]] && echo int ||echo char
char
[root@codis-178 ~]# [[ 123 =~ ^[0-9]+$ ]] && echo int ||echo char
int
3.判断字符串长度是否为0
思路1:使用-z和-n的语法
[root@codis-178 ~]# [ -z "oldboy" ] && echo 1 ||echo 0
0
[root@codis-178 ~]# [ -n "oldboy" ] && echo 1 ||echo 0
1
思路2:使用变量子串判断
[root@codis-178 ~]# [ ${#char} -eq 0 ] && echo 1 ||echo 0
0
思路3:使用expr length函数判断
[root@codis-178 ~]# [ `expr length "oldboy"` -eq 0 ] && echo 1 || echo 0
0
思路4:使用wc的-L参数统计
[root@codis-178 ~]# [ `echo oldboy|wc -L` -eq 0 ] && echo 1 ||echo 0
0
思路5:使用awk length函数判断
[root@codis-178 ~]# [ `echo oldboy|awk '{print length}'` -eq 0 ] && echo 1 || echo 0
0
4.生产场景案例
(1)监控memcached服务
[root@codis-178 ~]# cat memcached.sh
#!/bin/bash
printf "del key\r\n"|nc 127.0.0.1 11211 &>/dev/null
printf "set key 0 0 10 \r\noldboy1234\r\n"|nc 127.0.0.1 11211 &>/dev/null
McValues=`printf "get key\r\n" |nc 127.0.0.1 11211|grep oldboy1234|wc -l`
if [ $McVaules -eq 1 ]
then
echo "memcached status is ok."
else
echo "memcached status is bad."
fi
思考题:如何监控MC服务、命中率、响应时间三个指标
(2)开发rsync启动脚本
[root@codis-178 ~]# cat rsyncd
#!/bin/bash
# chkconfig: 2345 20 80
# description: Rsyncd Startup script by xiaoda
if [ $# -ne 1 ]
then
echo $"usage:$0 {start|stop|restart}"
exit 1
fi
if [ "$1" = "start" ]
then
rsync --daemon
sleep 2
if [ `netstat -lntip|grep rsync|wc -l` -ge 1 ]
then
echo "rsyncd is started."
exit 0
fi
elif [ "$1" = "stop" ]
then
killall rsync &>/dev/null
sleep 2
if [ `netstat -lntip|grep rsync|wc -l` -eq 0 ]
then
echo "rsyncd is stoped."
exit 0
fi
elif [ "$1" = "restart" ]
then
killall rsync
sleep 1
killpro=`netstat -lntup|grep rsync |wc -l`
rsync --daemon
sleep 1
startpro=`netstat -lntup|grep rsync |wc -l`
if [ $killpro -eq 0 -a $startpro -ge 1 ]
then
echo "rsync is restarted."
exit 0
fi
else
echo $"usage:$0 {start|stop|restart}"
exit 1
fi
运行结果:
[root@codis-178 ~]# /etc/init.d/rsyncd stop
rsyncd is stoped.
[root@codis-178 ~]# netstat -lntup |grep 873
[root@codis-178 ~]# /etc/init.d/rsyncd start
[root@codis-178 ~]# netstat -lntup |grep 873
tcp 0 0 192.168.1.178:873 0.0.0.0:* LISTEN 13878/rsync
Shell编程之IF条件的更多相关文章
- Shell编程之case条件
一.case条件语句 1.语法 case "变量" in 值 1) 指令 1... ;; 值 2) 指令 2... ;; *) 指令 3... esac case条件语句的执行流程 ...
- shell编程之awk命令详解
shell编程之awk命令详解 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; out ...
- shell编程之case分支语句
shell编程之case分支语句 case分支语句和if的多分支语句很相似. if多分支语句一般用在有(区间范围)的地方 :例如:0-100之间. if需要判断多个不同的条件. case的分支语句用在 ...
- 03 shell编程之case语句与函数
本文所有内容均来自当年博主当年学习笔记,若有不足欢迎指正 Shell编程之case语句与函数 学习目标: 掌握case语句编程 掌握shell函数的使用 目录结构: Case语句 Case语句的作用 ...
- shell编程之if语句
shell编程之if判断 目录 shell编程之if判断 1.整数比较 2.字符串比较 3.举例 1.数字比较 2.字符串比较 4.Other 1.整数比较 -eq 等于,如:if [ "$ ...
- shell 编程之 for while until 循环
shell 的for循环 的格式如下: for 变量 in 列表 do ... done 列表是一组值的序列 每个值通过空格隔开 每循环一次,列表中的下一个值赋给变量 in 列表是可选的,如果不用他 ...
- shell 编程之 if...else case...esac
shell的条件判断语句有三种 if...fi 语句 if...else...fi 语句 if...elif...fi 语句 例子: a=10; b=20; if [ $a -gt %b ] t ...
- Shell编程之Shift的用法
位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift 1. 非常 ...
- shell编程之echo printf 命令
shell中 echo 和printf 都能用作输出,printf可以算是echo的增强版 显示转义字符 echo \""abcdef\"" >>& ...
随机推荐
- EXCEL VBA代码,实现点击Sheet1按钮控件保存不连续单元格的数据到Sheet2中,然后清空输入内容
Private Sub SaveAndClear() Dim Header, Deatil, Order As Range Dim lastrow1, lastrow2 As Long Dim i A ...
- 49、android ListView几个比较特别的属性
由于这两天在做listView的东西,所以整理出来一些我个人认为比较特别的属性,通过设置这样的属性可以做出更加美观的列表 android:stackFromBottom="true" ...
- 初探webpack之环境配置
先感叹一句,前端的发展真是太快了,ng和bb还没怎么学好就要过时了.现在感觉react当是未来的一个大方向. 以前一直用的grunt,不过前段时间作者已经停止更新了.正好webpack风头正盛,咱也不 ...
- 【BZOJ1812】[Ioi2005]riv 树形DP
[BZOJ1812][Ioi2005]riv Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河, ...
- 《从零开始学Swift》学习笔记(Day 49)——扩展声明
原创文章,欢迎转载.转载请注明:关东升的博客 声明扩展的语法格式如下: extension 类型名 { //添加新功能 } 声明扩展的关键字是extension,“类型名”是Swift中已有的类型,包 ...
- CAFFE学习笔记(五)用caffe跑自己的jpg数据
1 收集自己的数据 1-1 我的训练集与测试集的来源:表情包 由于网上一幅一幅图片下载非常麻烦,所以我干脆下载了两个eif表情包.同一个表情包里的图像都有很强的相似性,因此可以当成一类图像来使用.下载 ...
- 巨蟒python全栈开发django1:自定义框架
今日大纲: 1.val和text方法的补充 2.信息收集卡用bootstrap实现 3.自定义web框架 4.http协议 5.自定义web框架2 今日内容详解: 1.val和text方法的补充 ht ...
- 费马小定理 Fermat Theory
w 整数的质数次方和自身的差是是质数的倍数 费马小定理(Fermat Theory)是数论中的一个重要定理,其内容为: 假如p是质数,且Gcd(a,p)=1,那么 a(p-1)≡1(mod p).即: ...
- <2013 08 13> TeX and LaTeX, some introduction
1. TeX是Donald E. Knuth教授的精心杰作,它是个功能非常强大的幕后排版系统,含有弹性很大,而且很低阶的排版语言.含有九百多条指令,用Pascal语言(的一个子集)写成. 2. T ...
- JavaScript数据结构与算法-数组练习
一. 创建一个记录学生成绩的对象,提供一个添加成绩的方法,以及一个显示学生平均成绩的方法. // 创建一个记录学生成绩的对象 const Students = function Students () ...