本文主要講解if條件語句在shell的使用場景和示例php
基本大綱: html
1.if條件語句的語法
mysql
2.if條件語句多種條件表達式語法
nginx
3.單分支if條件語句實踐
sql
4.if條件語句的深刻實踐及場景使用
shell
一:if條件語句的語法數據庫
1)單分支結構bash
第一種語法:服務器
if <條件表達式>curl
then
指令
fi
第二中語法:
if <條件表達式>;then
指令
fi
上面的「<條件表達式>」部分能夠是test、[]、[[]]、(())等條件表達式,也能夠直接使用命令做爲條件表達式。
2)雙分支結構
if條件語句的單分支結構主體就是"若是···,那麼···",而if條件語句的雙分支結構主體則爲"若是···,那麼···,不然···"
if條件語句的雙分支結構語法爲:
if <條件表達式>
then
指令集1
else
指令集2
fi
3)多分支結構
if條件語句多分支結構的主體爲」若是···,那麼···,不然若是···,那麼,不然若是···,那麼···,不然···「
if條件語句多分支語法爲:
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
注意:
注意多分支elif的寫法,每一個elif都要帶有then。
最後結尾的else後面沒有then。
二:if條件語句多種條件表達式語法
1)test條件表達式
if test 表達式
then
指令
fi
2)[]條件表達式
if [字符串或算術表達式]
then
指令
fi
3)[[]]條件表達式
if [[字符串表達式]]
then
指令
fi
4)(())條件表達式
if ((算術表達式))
then
指令
fi
5)命令表達式
if 命令
then
指令
fi
三:單分支if條件語句實踐
if單分支條件語句示例以下:
[root@aliyun if]# [ -f /etc/hosts ] && echo 1 1 [root@aliyun if]# [[ -f /etc/hosts ]] && echo 1 1 [root@aliyun if]# test -f /etc/hosts && echo 1 1 [root@aliyun if]# cat if.sh #!/bin/bash #Author:ywxi #Time:2018-06-03 07:55:58 #Version:V1.0 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@aliyun if]# sh if.sh 1 1 1
四:if條件語句的深刻實踐及場景使用
1)開發監控MySQL數據庫的腳本
數據庫端口檢測方法: [root@aliyun ywxi]# netstat -tnlp | grep 3306|awk -F "[ :]+" '{print $5}' 3306 [root@aliyun ywxi]# netstat -tnlp |grep 3306 |wc -l 1 [root@aliyun ywxi]# netstat -tnlp | grep mysql | wc -l 1 [root@aliyun ywxi]# ss -lntup|grep mysql|wc -l 1 [root@aliyun ywxi]# ss -lntup|grep 3306|wc -l 1 [root@aliyun ywxi]# lsof -i :3306|wc -l 2 [root@aliyun ywxi]# yum install telnet nmap nc lsof -y [root@aliyun scripts]# nmap 127.0.0.1 -p 3306|grep open|wc -l #查看遠端3306端口是否開通,過濾open關鍵字,結果返回1,說明有open關鍵字,表示3306端口是通的 [root@aliyun scripts]# echo -e "\n"|telnet 127.0.0.1 3306 2>/dev/null|grep Connected|wc -l #telnet是經常使用來檢測服務器端口是否通暢的一個好用的命令,在非交互時須要採用特殊寫法才行,過 濾的關鍵字爲Connected,返回1,說明有Connected,表示3306端口是通的。 [root@aliyun scripts]# nc -w 2 127.0.0.1 3306 &>/dev/null [root@aliyun scripts]# echo $? 0 #nc命令很強大,這裏用來檢測端口。根據執行命令的返回值判斷端口是否順暢,若是返回0,則表示順 暢,-w爲超時時間 [root@aliyun scripts]# ps -ef |grep mysql|grep -v grep |wc -l 2 #對服務進程或進程數進行監控 #下面是客戶端模擬用戶訪問的方式進行監控。 [root@aliyun scripts]# wget --spider --timeout=10 --tries=2 www.baidu.com &>/dev/null [root@aliyun scripts]# echo $? 0 #在wget後面加url的檢測方法,&>/dev/null表示不輸出,只看返回值。--spider的意思是模擬爬取,--t imeout=10的意思是10秒超時,--tries=2表示若是不成功,則重試2次。查看返回值來判斷 [root@aliyun scripts]# wget -T 10 -q --spider http://www.baidu.com >&/dev/null [root@aliyun scripts]# echo $? 0 #與上面類似 [root@aliyun scripts]# curl -s -o /dev/null http://www.baidu.com [root@aliyun scripts]# echo $? 0 #利用curl進行檢測,-s爲沉默模式,-o /dev/null表示將輸出定向到空 [root@aliyun scripts]# cat testmysql.php <?php $link_id=mysql_connect('127.0.0.1','root','xiwei1995') or mysql_error(); if($link_id){ echo "mysql successful by ywxi"; }else{ echo mysql_error(); } ?> #此方法是監控數據庫是否異常的最佳的方法 開發監控MySQL數據庫的腳本: [root@aliyun scripts]# cat ifmysql.sh #腳本1: #!/bin/sh echo "#####method1######" if [ `netstat -tnlp |grep 3306|awk -F "[ :]+" '{print $5}'` -eq 3306 ] then echo "MySQL is Runnig." else echo "MySQL is Stopped." /etc/init.d/mysqld start fi #腳本2: echo " " echo "#####method2######" if [ "`netstat -tnlp |grep 3306|awk -F "[ :]+" '{print $5}'`" = "3306" ] then echo "MySQL is Runnig." else echo "MySQL is Stopped." /etc/init.d/mysqld start fi #腳本3: echo " " echo "#####method3######" if [ `netstat -tnlp |grep mysqld|wc -l ` -gt 0 ] then echo "MySQL is Runnig." else echo "MySQL is Stopped." /etc/init.d/mysqld start fi #腳本4: echo " " echo "#####method4######" if [ `lsof -i tcp:3306 |wc -l` -gt 0 ] then echo "MySQL is Runnig." else echo "MySQL is Stopped." /etc/init.d/mysqld start fi #腳本5: echo " " echo "#####method5######" [ `rpm -qa nmap|wc -l` -lt 1 ] && yum -y install nmap &>/dev/null if [ `nmap 127.0.0.1 -p 3306 2>/dev/null|grep open|wc -l` -gt 0 ] then echo "MySQL is Runnig." else echo "MySQL is Stopped." /etc/init.d/mysqld start fi #腳本6: echo " " echo "#####method6######" [ `rpm -qa nc|wc -l` -lt 1 ] && yum -y install nc &>/dev/null if [ `nc -w 2 127.0.0.1 3306 &>/dev/null &&echo ok|grep ok|wc -l` -gt 0 ] then echo "MySQL is Runnig." else echo "MySQL is Stopped." /etc/init.d/mysqld start fi #腳本7: echo " " echo "#####method7######" if [ `ps -ef|grep -v grep|grep mysql|wc -l` -gt 0 ] then echo "MySQL is Runnig." else echo "MySQL is Stopped." /etc/init.d/mysqld start fi
2)監控Nginx Web服務是否異常
監控Nginx Web服務異常的方法和監控MySQL數據庫同樣,也是使用端口、進程或經過wget/curl訪問來進行檢測。
[root@aliyun scripts]# netstat -tnlp|grep -w 80|awk -F "[ :]+" '{print $5}' 80 [root@aliyun scripts]# netstat -tnlp|grep -w 80|wc -l 1 [root@aliyun scripts]# netstat -tnlp|grep nginx|wc -l 1 [root@aliyun scripts]# ss -lntup|grep nginx|wc -l 1 [root@aliyun scripts]# ss -lntup|grep -w 80|wc -l 2 [root@aliyun scripts]# lsof -i tcp:80|wc -l 4 [root@aliyun scripts]# nmap 127.0.0.1 -p 80|grep open|wc -l 1 [root@aliyun scripts]# echo -e "\n"|telnet 127.0.0.1 80 2>/dev/null |grep Connected|wc -l 1 [root@aliyun scripts]# nc -w 2 127.0.0.1 80 &>/dev/null [root@aliyun scripts]# echo $? 0 [root@aliyun scripts]# ps -ef | grep nginx|grep -v grep|wc -l 2 [root@aliyun scripts]# ps -C nginx --no-header 8094 ? 00:00:00 nginx 8121 ? 00:00:00 nginx [root@aliyun scripts]# ps -C nginx --no-header|wc -l 2 [root@aliyun scripts]# wget --spider --timeout=10 --tries=2 http://127.0.0.1/index.html &>/dev/null [root@aliyun scripts]# echo $? 0 [root@aliyun scripts]# wget -T 10 -q --spider http://127.0.0.1/index.html &>/dev/null [root@aliyun scripts]# echo $? 0 [root@aliyun scripts]# curl -s -o /dev/null http://127.0.0.1/index.html [root@aliyun scripts]# echo $? 0 [root@aliyun scripts]# curl -I -s -w "%{http_code}\n" -o /dev/null http://127.0.0.1/index.html 200 #根據http相應header的結果進行判斷(200.301.302都表示正常) 等價於: curl -I http://127.0.0.1/index.html 2>/dev/null|head -1|egrep "200|302|301" [root@aliyun scripts]# cat ifNginx.sh #腳本1: #!/bin/bash echo "######http method1######" if [ `netstat -tnlp|grep -w 80|awk -F "[ :]+" '{print $5}'` -eq 80 ] then echo "Nginx is Running." else echo "Nginx is Stopped." /etc/init.d/nginx start fi #腳本2: echo " " echo "######http method2######" if [ "`netstat -tnlp|grep -w 80|awk -F "[ :]+" '{print $5}'`" = "80" ] then echo "Nginx is Running." else echo "Nginx is Stopped." /etc/init.d/nginx start fi #腳本3: echo " " echo "######http method3######" if [ `netstat -tnlp|grep nginx|wc -l` -gt 0 ] then echo "Nginx is Running." else echo "Nginx is Stopped." /etc/init.d/nginx start fi #腳本4: echo " " echo "######http method4######" if [ `lsof -i tcp:80|wc -l` -gt 0 ] then echo "Nginx is Running." else echo "Nginx is Stopped." /etc/init.d/nginx start fi #腳本5: echo " " echo "######http method5######" [ `rpm -qa nmap|wc -l` -lt 1 ] && yum -y install nmap &>/dev/null if [ `nmap 127.0.0.1 -p 80 2>/dev/null|grep open|wc -l` -gt 0 ] then echo "Nginx is Running." else echo "Nginx is Stopped." /etc/init.d/nginx start fi #腳本6: echo " " echo "######http method6######" [ `rpm -qa nc|wc -l` -lt 1 ] && yum -y install nc &>/dev/null if [ `nc -w 2 127.0.0.1 80 &>/dev/null&&echo ok|grep ok|wc -l` -gt 0 ] then echo "Nginx is Running." else echo "Nginx is Stopped." /etc/init.d/nginx start fi #腳本7: echo " " echo "######http method7######" if [ `ps -ef|grep -v grep|grep nginx|wc -l` -ge 1 ] then echo "Nginx is Running." else echo "Nginx is Stopped." /etc/init.d/nginx start fi #腳本8: echo " " echo "######http method8######" if [[ `curl -I -s -w "%{http_code}\n" -o /dev/null http://127.0.0.1/index.html` =~ [23]0[012] ]] then echo "Nginx is Running." else echo "Nginx is Stopped." /etc/init.d/nginx start fi #腳本9: echo " " echo "######http method9######" if [ `curl -I http://127.0.0.1/index.html 2>/dev/null|head -1|egrep "200|302|301"|wc -l` -eq 1 ] then echo "Nginx is Running." else echo "Nginx is Stopped." /etc/init.d/nginx start fi #腳本10: echo " " echo "######http method10######" if [ "`curl -s http://127.0.0.1/index.html`" = "ywxitest" ] then echo "Nginx is Running." else echo "Nginx is Stopped." /etc/init.d/nginx start fi