• 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
    "|nc 127.0.0.1 11211 &>/dev/null
    printf "set key 0 0 10 
    oldboy1234
    "|nc 127.0.0.1 11211 &>/dev/null
    McValues=`printf "get key
    " |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
    
  • 相关阅读:
    一致性hash算法
    运算符的重载
    HTTP协议详解
    SOA 新业务语言 新系统架构——什么是SOA
    js中几种实用的跨域方法原理详解
    Linq基于两个属性的分组
    BackBone结合ASP.NET MVC实现页面路由操作
    CSS学习总结
    单页应用 WebApp SPA 骨架 框架 路由 页面切换 转场
    2016年最值得学习的五大开源项目
  • 原文地址:https://www.cnblogs.com/tongxiaoda/p/7454610.html
Copyright © 2020-2023  润新知