zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    基于摸板匹配的目標跟蹤算法
    spoj 2713 Can you answer these queries IV
    zoj 3633 Alice's present
    hdu 3642 Get The Treasury
    poj 1195 Mobile phones
    poj 2760 End of Windless Days
    zoj 3540 Adding New Machine
    spoj 1716 Can you answer these queries III
    spoj 1043 Can you answer these queries I
    spoj 2916 Can you answer these queries V
  • 原文地址:https://www.cnblogs.com/tongxiaoda/p/7454610.html
Copyright © 2011-2022 走看看