1.1 條件表達式
1.1.1 文件判斷
常用文件測試操作符
常用文件測試操作符 |
說明 |
-d文件,d的全拼為directory |
文件存在且為目錄則為真,即測試表達式成立 |
-f文件,f的全拼為file |
文件存在且為普通文件則為真,即測試表達式成立 |
-e文件,e的全拼為exist |
文件存在則為真,即測試表達式成立。注意區別於“-f”,-e不辨別是目錄還是文件 |
-r文件,r的全拼為read |
文件存在且可讀則為真,即測試表達式成立 |
-s文件,s的全拼為size |
文件存在且文件大小不為0則為真,即測試表達式成立 |
-w文件,w的全拼為write |
文件存在且可寫則為真,即測試表達式成立 |
-x文件,x的全拼為executable |
文件存在且可執行則為真,即測試表達式成立 |
-L文件,L的全拼為link |
文件存在且為鏈接文件則為真,即測試表達式成立 |
fl -nt f2,nt 的全拼為 newer than |
文件fl比文件f2新則為真,即測試表達式成立。根據文件的修改時間來計算 |
fl -ot f2,ot 的全拼為 older than |
文件fl比文件f2舊則為真,即測試表達式成立。根據文件的修改時間來計算 |
判斷文件是否存在
[root@clsn scripts]# [ -f /etc/hosts ] [root@clsn scripts]# echo $? 0 [root@clsn scripts]# [ -f /etc/hosts1 ] [root@clsn scripts]# echo $? 1
判斷文件是否存在,返回方式
[root@clsn scripts]# [ -f /etc/hosts ] && echo "文件存在" || echo "文件不存在" 文件存在 [root@clsn scripts]# [ -f /etc/hosts1 ] && echo "文件存在" || echo "文件不存在" 文件不存在
判斷目錄是否存在
[root@clsn scripts]# [ -d /tmp ] && echo "目錄存在" || echo "目錄不存在" 目錄存在 [root@clsn scripts]# [ -d /tmp1 ] && echo "目錄存在" || echo "目錄不存在" 目錄不存在
使用變量的方法進行判斷
dir=/etc1/;[ -d $dir ] && tar zcf etc.tar.gz $dir || echo "$dir目錄不存在"
1.1.2 字符串判斷
字符串測試操作符
常用字符串測試操作符 |
說明 |
-n "字符串" |
若字符串的長度不為0,則為真,即測試表達式成立,n可以理解為no zero |
-Z "字符串" |
若字符串的長度為0,則為真,即測試表達式成立,z可以理解為zero的縮寫 |
"串 1"== "串 2" |
若字符串1等於字符串2,則為真,即測試表達式成立,可使用"=="代替"=" |
"串 1" != "串 2" |
若字符串1不等於字符串2,則為真,即測試表達式成立,但不能用"!=="代替"!=" |
1.對於字符串的測試,一定要將字符串加雙引號之后再進行比較。 2.空格非空 |
-z 判斷字符串長度
[root@clsn scripts]# x= ; [ -z "$x" ] && echo "輸入為空" || echo '輸入有內容' 輸入為空 [root@clsn scripts]# x=12 ; [ -z "$x" ] && echo "輸入為空" || echo '輸入有內容' 輸入有內容
-n 判斷字符串長度
[root@clsn scripts]# x=12 ; [ -n "$x" ] && echo "輸入有內容" || echo '輸入為空' 輸入有內容 [root@clsn scripts]# x= ; [ -n "$x" ] && echo "輸入有內容" || echo '輸入為空' 輸入為空
"串 1" == " 串 2 " 使用定義變量的方式進行判斷
cmd=$1 [ "$cmd" == "start" ] && echo start # 測試 [root@clsn scripts]# cmd=start;[ "$cmd" == "start" ] && echo start start
1.1.3 整數判斷
整數二元比較操作符參考
在[]以及test中 使用的比較符號 |
在(())和[[]]中 使用的比較符號 |
說明 |
-eq |
==或= |
相等,全拼為equal |
-ne |
!= |
不相等,全拼為not equal |
-gt |
> |
大於,全拼為greater than |
-ge |
>= |
大於等於,全拼為greater equal |
-lt |
< |
小於,全拼為丨ess than |
-le |
<= |
小於等於,全拼為less equal |
判斷兩數是否相等
[root@clsn scripts]# [ 1 -eq 1 ] [root@clsn scripts]# echo $? 0 [root@clsn scripts]# [ 1 -eq 2 ] [root@clsn scripts]# echo $? 1
大於等於
[root@clsn ~]# [ 11 -ge 1 ] && echo "成立" || echo "不成立" 成立
小於
[root@clsn ~]# [ 11 -lt 1 ] && echo "成立" || echo "不成立" 不成立
大於
[root@clsn ~]# [ 11 -gt 1 ] && echo "成立" || echo "不成立" 成立
不等於
[root@clsn ~]# [ 11 -ne 1 ] && echo "成立" || echo "不成立" 成立
1.1.4 邏輯符號
常用邏輯操作符
在[]和test中使用的操作符 |
說明 |
在[[]]和中使用的操作符 |
說明 |
-a |
[ 條件A -a 條件B ] A與B都要成立,整個表達式才成立 |
&& |
and,與,兩端都為真,則結果為真 |
-o |
[ 條件A -o 條件B] A與B都不成立,整個表達式才不成立 |
|| |
or,或,兩端有一個為真,則結果為真 |
! |
|
! |
not,非,兩端相反,則結果為真 |
邏輯操作符與整數判斷配合
[root@clsn ~]# [ 11 -ne 1 ] && echo "成立" || echo "不成立" 成立
取反
[root@clsn ~]# [ ! 11 -ne 1 ] && echo "成立" || echo "不成立" 不成立
兩邊都為真
[root@clsn ~]# [ 11 -ne 1 -a 1 -eq 1 ] && echo "成立" || echo "不成立" 成立
至少有一邊為真
[root@clsn ~]# [ 11 -ne 1 -o 1 -eq 1 ] && echo "成立" || echo "不成立" 成立
感嘆號的特殊用法
使用歷史命令,感嘆號加上history中的序號,即可執行
[root@clsn ~]# !516 ls anaconda-ks.cfg bootime.avg setup.sh vim
1.1.5 【練習題】開發3個shell腳本比較2個整數大小
要求:
1. 分別以定義變量,腳本傳參以及read讀入的方式寫3個腳本。
2. 用條件表達式(禁止if語句)進行判斷。
3. 將2個整數的比較結果輸出到屏幕,出錯需要提示。
使用定義變量方法
[root@clsn panduan1]# cat panduan1.sh #!/bin/bash ############################################################# # File Name: panduan1.sh # Version: V1.0 # Author: clsn # Organization: http://blog.znix.top # Created Time : 2017-12-06 11:27:32 # Description: ############################################################# NUM1=6 NUM2=2 expr 1 + $NUM1 &>/dev/null [ $? -eq 2 ] && echo "$NUM1 不是整數 " && exit 2 expr 1 + $NUM2 &>/dev/null [ $? -eq 2 ] && echo "$NUM2 不是整數 " && exit 2 [ "$NUM1" -eq "$NUM2" ] && echo $NUM1 = $NUM2 && exit [ "$NUM1" -gt "$NUM2" ] && echo $NUM1 \> $NUM2 && exit [ "$NUM1" -lt "$NUM2" ] && echo $NUM1 \< $NUM2
使用傳參方法
[root@clsn panduan1]# cat panduan_chuanchan.sh #!/bin/bash ############################################################# # File Name: panduan1.sh # Version: V1.0 # Author: clsn # Organization: http://blog.znix.top # Created Time : 2017-12-06 11:27:32 # Description: ############################################################# [ $# -ne 2 ] && echo "UASGE $0 num1 num2 " && exit NUM1=$1 NUM2=$2 expr 1 + $NUM1 &>/dev/null [ $? -eq 2 ] && echo "$NUM1 不是整數 " && exit 2 expr 1 + $NUM2 &>/dev/null [ $? -eq 2 ] && echo "$NUM2 不是整數 " && exit 2 [ "$NUM1" -eq "$NUM2" ] && echo $NUM1 = $NUM2 && exit [ "$NUM1" -gt "$NUM2" ] && echo $NUM1 \> $NUM2 && exit [ "$NUM1" -lt "$NUM2" ] && echo $NUM1 \< $NUM2
使用read讀入
[root@clsn panduan1]# cat panduan_read.sh #!/bin/bash ############################################################# # File Name: panduan1.sh # Version: V1.0 # Author: clsn # Organization: http://blog.znix.top # Created Time : 2017-12-06 11:27:32 # Description: ############################################################# read -p "請輸入第一個整數:" NUM1 read -p "請輸入第二個整數:" NUM2 expr 1 + $NUM1 &>/dev/null [ $? -eq 2 ] && echo "$NUM1 不是整數 " && exit 2 expr 1 + $NUM2 &>/dev/null [ $? -eq 2 ] && echo "$NUM2 不是整數 " && exit 2 [ "$NUM1" -eq "$NUM2" ] && echo "$NUM1 = $NUM2" && exit [ "$NUM1" -gt "$NUM2" ] && echo "$NUM1 > $NUM2" && exit echo "$NUM1 < $NUM2"
1.2 if條件語句
# 條件表達式和if語句可以互相轉換
1.2.1 三種語法
單分支語句
if [ -f /etc/hosts ] then echo '文件存在' fi
雙分支語句
if [ -f /etc/hosts ] then echo "文件存在" else echo "文件不存在" echo "..." >>/tmp/test.log fi
多分支語句
if [ -f /etc/hosts ] then echo " hosts文件存在" elif [ -f /etc/host ] then echo " host文件存在" fi
1.2.2 if條件語句小結
單分支:一個條件一個結果
雙分支:一個條件兩個結果
多分支:多個條件多個結果
1.2.3 【練習題1】輸入2個數字,比較大小(使用if語句結合條件表達式實現)
說明:
3個腳本:使用直接賦值,傳參,read任一種方法寫3種腳本(單分支,雙分支,多分支)
示例腳本一:

1 [root@clsn panduan1]# cat if_panduan_1.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: panduan1.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-06 11:27:32 9 # Description: 10 ############################################################# 11 12 read -p "請輸入第一個整數:" NUM1 13 expr 1 + $NUM1 &>/dev/null 14 if [ $? -eq 2 ] 15 then 16 echo "$NUM1 不是整數 " 17 exit 2 18 fi 19 20 read -p "請輸入第二個整數:" NUM2 21 expr 1 + $NUM2 &>/dev/null 22 if [ $? -eq 2 ] 23 then 24 echo "$NUM2 不是整數 " 25 exit 2 26 fi 27 28 # 判斷輸入數值大小 29 if [ $NUM1 -eq $NUM2 ] 30 then 31 echo "$NUM1 = $NUM2" 32 exit 33 fi 34 35 if [ $NUM1 -gt $NUM2 ] 36 then 37 echo "$NUM1 > $NUM2" 38 exit 39 fi 40 41 if [ $NUM1 -lt $NUM2 ] 42 then 43 echo "$NUM1 < $NUM2" 44 fi
示例腳本二:

1 [root@clsn panduan1]# cat if_panduan_2.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: if_panduan_2.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-06 11:27:32 9 # Description: 10 ############################################################# 11 12 read -p "請輸入第一個整數:" NUM1 13 expr 1 + $NUM1 &>/dev/null 14 if [ $? -eq 2 ] 15 then 16 echo "$NUM1 不是整數 " 17 exit 2 18 fi 19 20 read -p "請輸入第二個整數:" NUM2 21 expr 1 + $NUM2 &>/dev/null 22 if [ $? -eq 2 ] 23 then 24 echo "$NUM2 不是整數 " 25 exit 2 26 fi 27 28 # 判斷輸入數值大小 29 if [ $NUM1 -eq $NUM2 ] 30 then 31 echo "$NUM1 = $NUM2" 32 exit 33 else 34 if [ $NUM1 -gt $NUM2 ] 35 then 36 echo "$NUM1 > $NUM2" 37 exit 38 else 39 if [ $NUM1 -lt $NUM2 ] 40 then 41 echo "$NUM1 < $NUM2" 42 fi 43 fi 44 fi
示例腳本三:

1 [root@clsn panduan1]# cat if_panduan_3.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: if_panduan_3.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-06 11:27:32 9 # Description: 10 ############################################################# 11 12 read -p "請輸入第一個整數:" NUM1 13 expr 1 + $NUM1 &>/dev/null 14 NUM1_FH=$? 15 if [ $NUM1_FH -eq 2 ] 16 then 17 echo "$NUM1 不是整數 " 18 exit 2 19 else 20 read -p "請輸入第二個整數:" NUM2 21 expr 1 + $NUM2 &>/dev/null 22 NUM2_FH=$? 23 if [ $NUM2_FH -eq 2 ] 24 then 25 echo "$NUM2 不是整數 " 26 exit 2 27 fi 28 fi 29 30 # 判斷輸入數值大小 31 if [ $NUM1 -eq $NUM2 ] 32 then 33 echo "$NUM1 = $NUM2" 34 exit 35 elif [ $NUM1 -gt $NUM2 ] 36 then 37 echo "$NUM1 > $NUM2" 38 exit 39 elif [ $NUM1 -lt $NUM2 ] 40 then 41 echo "$NUM1 < $NUM2" 42 fi
1.2.4 【練習題2】系統內存低於100M郵件報警,加入計划任務,3分鍾檢查一次。
對於開發程序而言,一般來說應該遵循下面的3步法則。
(1)分析需求
明白開發需求,是完成程序的大前提,因此,分析需求至關重要,一切不以需求為主的程序開發,都是耍流氓的!
(2)設計思路
設計思路就是根據需求,把需求進行拆解,分模塊逐步實現,例如本題可以分為如下幾步:
1)獲取當前系統剩余內存的值(先在命令行實現)。
2)配置郵件報警(可采用第三方郵件服務器)。
3)判斷取到的值是否小於100MB,如果小於100MB,就報警(采用if語句)。
4)編碼實現Shell腳本。
5)加入crond定時任務,每三分鍾檢查一次。
(3)編碼實現
編碼實現就是具體的編碼及調試過程,工作中很可能需要先在測試環境下調試,調試好了,再發布到生產環境中。
第一步 先配置郵件服務,保證能夠發生郵件
echo 'set from=mail@znix.top smtp=smtp.znix.top smtp-auth-user=mail@znix.top smtp-auth-password=****** smtp-auth=login' >> /etc/mail.rc
發送測試郵件發送
echo "`date +%F_%T`" |mail -s "這是測試郵件" admin@znix.top
第二步編寫檢查腳本
[root@clsn scripts]# cat mem_info.sh #!/bin/bash ############################################################## # File Name: mem_info.sh # Version: V1.0 # Author: clsn # Organization: http://blog.znix.top # Created Time : 2017-12-06 8:42:50 # Description: ############################################################## Mem=`free -m |awk 'NR==2{print $NF}'` host=`hostname` Ip=`hostname -I` Date=`date +%F_%T` mail_file=/tmp/mail.s dest_user=admin@znix.top if [ $Mem -lt 100 ] then echo "發生時間: $Date" >$mail_file echo "發生主機: $host 主機IP地址: $Ip " >> $mail_file echo "內存余量: $Mem M" >> $mail_file mail -s "【警告】內存不足了呀!" $dest_user < $mail_file fi
第三步測試腳本(可以修改判斷的值)
[root@clsn scripts]# sh mem_info.sh
第四步 腳本測試成功,寫入定時任務
[root@clsn panduan1]# crontab -l # 檢查內存剩余大小 */3 * * * * /bin/sh /server/scripts/panduan/mem_info.sh &>/dev/null
至此,一個監控腳本就寫好了
1.2.5 【練習題3】模擬編寫啟動nginx腳本
腳本內容

1 [root@clsn scripts]# cat nginx.sh 2 #!/bin/bash 3 ############################################################## 4 # File Name: nginx.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-05 20:56:06 9 # Description: 10 ############################################################## 11 . /etc/init.d/functions 12 13 StartCheck=`netstat -lntup |grep -c 80` 14 StartCMD='/application/nginx/sbin/nginx ' 15 StopCMD='/application/nginx/sbin/nginx -s stop ' 16 StatusCheck=`netstat -lntp|grep -c nginx` 17 ReloadCMD='/application/nginx/sbin/nginx -s reload' 18 CheckCMD='/application/nginx/sbin/nginx -t' 19 UsaGe="Usage: $0 {start|stop|status|reload|check}" 20 21 22 COMMAND=$1 23 24 if [ $# -ne 1 ] 25 then 26 echo $UsaGe && exit 2 27 fi 28 29 if [ $COMMAND = start ] 30 then 31 if [ $StartCheck == 1 ] 32 then 33 action "啟動Nginx失敗,端口被占用" /bin/false 34 else 35 $StartCMD 36 action "啟動Nginx" /bin/true 37 fi 38 elif [ $COMMAND = stop ] 39 then 40 $StopCMD &>/dev/null 41 if [ $? -eq 0 ] 42 then 43 action "停止Nginx" /bin/true 44 else 45 action "停止Nginx" /bin/false 46 fi 47 elif [ $COMMAND = status ] 48 then 49 if [ $StatusCheck -eq 1 ] 50 then 51 echo "nginx 正在運行..." 52 else 53 echo "Nginx 未運行." 54 fi 55 elif [ $COMMAND = reload ] 56 then 57 $ReloadCMD 58 action "reload" /bin/true 59 elif [ $COMMAND = check ] 60 then 61 $CheckCMD 62 else 63 echo $UsaGe 64 exit 2 65 fi
腳本執行過程:
1.2.6 【練習題5】Web及MySQL服務異常監測案例
用if條件語句實現對Nginx Web服務以及MySQL數據庫服務是否正常進行檢測,如果服務未啟動,則啟動相應服務。
腳本編寫思路:
判斷web服務器正常 ↓
1、進程 ps -ef |grep [n]ginx 2、端口 netstat ss losf telnet nc nmap 3、curl 頁面 返回值 4、curl check.html 的內容
判斷mysql服務器正常 ↓
1、端口 netstat ss losf telnet nc nmap 2、進程 ps -ef |grep [m]ysql 3、mysql 登錄訪問看一下 4、mysql insert一個數據 select一個數據
web服務監控腳本示例

1 [root@clsn scripts]# cat web_check.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: web_check.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-07 10:53:38 9 # Description: 10 ############################################################# 11 . /etc/init.d/functions 12 13 JinChen=`ps -ef |grep -c [n]ginx` 14 QiDong='/server/scripts/nginx.sh start' 15 StatuS=`curl -I -w "%{http_code}\n" -o /dev/null -s 10.0.0.180` 16 StatuS2=`curl -s 10.0.0.180/check.html|grep -c ok` 17 StartNginx='/server/scripts/nginx.sh start' 18 19 if [ $JinChen -ge 2 ] 20 then 21 if [ "$StatuS" -eq 200 ] 22 then 23 if [ "$StatuS2" -eq 1 ] 24 then 25 action "Nginx 服務運行正常" /bin/true 26 else 27 action "請檢查chenk.html文件!" /bin/false 28 fi 29 else 30 action "請檢查首頁文件!" /bin/false 31 fi 32 else 33 action "Nginx 未正常運行!" /bin/false 34 $StartNginx 35 fi
腳本執行過程:
1.3 case條件結構語句
1.3.1 case語法結構
case "字符串變量" in 值1) 指令1 ;; 值2) 指令2 ;; 值*) 指令 esac
1.3.2 case與if的對比
case書寫方式
case $name in 值1) 指令1 ;; 值2) 指令2 ;; *) 指令 esac
if書寫方式
if [ $name == "值1" ] then 指令1 elif [ $name == "值2" ] then 指令2 else 指令 fi
1.3.3 case值的書寫方式
apple) echo -e "$RED_COLOR apple $RES" ;;
也可以這樣寫,輸入2種格式找同一個選項
apple|APPLE) echo -e "$RED_COLOR apple $RES" ;;
1.3.4 case語句小結
😋 case語句就相當於多分支的if語句。case語句的優勢是更規范、易讀。
😋 case語句適合變量的值少,且為固定的數字或字符串集合。(1,2,3)或(start,stop,restart)。
😋 系統服務啟動腳本傳參的判斷多用case語句,多參考rpcbind/nfs/crond腳本;菜單腳本也可以使用case
1.3.5 【練習題1】使用case編寫一個菜單腳本
腳本內容

1 [root@clsn case]# cat menu.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: menu.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-07 14:47:36 9 # Description: 10 ############################################################# 11 12 13 cat<<EOF 14 1. install rsync 15 2. install nfs 16 3. install mysql 17 4. install all 18 EOF 19 20 read -p '請輸入你的選擇:' chs 21 22 case $chs in 23 1) 24 echo install rsync success 25 ;; 26 2) 27 echo install nfs success 28 ;; 29 3) 30 echo install mysql success 31 ;; 32 4) 33 echo install rsync/nfs/mysql success 34 ;; 35 *) 36 echo "你輸入有誤" 37 esac
腳本執行過程:
1.3.6 【練習題2】輸出帶有顏色的水果菜單
腳本內容:

1 [root@clsn scripts]# cat fruits.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: fruits.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-06 21:23:31 9 # Description: 10 ############################################################# 11 cat <<EOF 12 ======================= 13 1.apple 14 2.pear 15 3.banana 16 4.exit 17 ======================= 18 EOF 19 read -t 10 -p "你要看什么水果:" Menu_Num 20 21 case "$Menu_Num" in 22 1) 23 echo -e "\033[31m apple \033[0m" 24 ;; 25 2) 26 echo -e "\033[32m pear \033[0m" 27 ;; 28 3) 29 echo -e "\033[33m banana \033[0m" 30 ;; 31 4) 32 exit 33 esac
腳本執行過程:
1.3.7 寫腳本規范及注意事項
1.變量名稱不能和系統已經存在的命令等重復 free == > Free
2. 判斷單位要統一
3. 腳本一行不超過一屏的一半。
4. 能寫成變量的內容盡量寫成變量
1.4 練習題
1.4.1 【練習題1】監控Memcached緩存服務是否正常
監控Memcached緩存服務是否正常,模擬用戶(web客戶端)檢測。
使用nc命令加上set/get來模擬檢測。
memecached安裝:http://www.cnblogs.com/clsn/p/7999510.html
腳本內容:

1 [root@clsn scripts]# vim memcache_check.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: memcache_check.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-07 15:50:03 9 # Description: 10 ############################################################# 11 . /etc/init.d/functions 12 . /etc/init.d/run # 函數 jingdutiao 使用 13 MemPort=`netstat -lntp |grep -c 0.0.0.0:11211` 14 Set_Key='printf "set clsn2017 0 10 8\r\nclsn2018\r\n"|nc 10.0.0.180 11211' 15 Get_Key='printf "get clsn2017\r\n" |nc 10.0.0.180 11211 |grep -c clsn2018' 16 ReStart='systemctl restart memcached.service' 17 18 if [ $MemPort -eq 1 ] 19 then 20 $Set_Key 21 $Get_Key 22 if [ $? -ne 1 ] 23 then 24 action "Memcached 運行正常!" /bin/true 25 else 26 action "Memcached 服務異常!" /bin/false 27 fi 28 else 29 action "服務未啟動!" /bin/false 30 $ReStart 31 jingdutiao 32 fi
腳本執行過程
1.4.2 【練習題2】使用(case)編寫rsync管理腳本
寫網絡服務獨立進程模式下Rsync的系統啟動腳本,例如:/etc/init.d/rsyncd {start|stop|restart}。
要求:
1.要使用系統函數庫技巧。
2.要用函數,不能一坨💩的方式。
3.在centos 6中 可被chkconfig管理。
注意:
服務的停止操作和啟動操作之間要有間隔時間,使用sleep 1
pkill 進程 sleep 1 start 服務
rsync服務啟動腳本

1 [root@clsn scripts]# cat rsyncd 2 #!/bin/bash 3 ############################################################# 4 # File Name: rsync_admin.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-07 18:39:37 9 # Description: 10 ############################################################# 11 12 . /etc/init.d/functions 13 . /etc/init.d/run 14 15 Rsync_Port=`netstat -lntup |grep -c 0.0.0.0:873` 16 Rsync_COM1='rsync --daemon' 17 Rsync_COM2='pkill rsync' 18 19 Rsync_Start() { 20 Rsync_Port1=`netstat -lntup |grep -c 0.0.0.0:873` 21 if [ $Rsync_Port1 -ne 0 ] 22 then 23 action "服務已啟動" /bin/false 24 exit 3 25 else 26 $Rsync_COM1 27 #action "Rsync 啟動" /bin/true 28 QiDong 29 fi 30 } 31 32 Rsync_Stop() { 33 Rsync_Port2=`netstat -lntup |grep -c 0.0.0.0:873` 34 if [ $Rsync_Port2 -eq 0 ] 35 then 36 action "服務未啟動" /bin/false 37 exit 3 38 else 39 $Rsync_COM2 40 #action "Rsync 停止" /bin/true 41 TingZhi 42 fi 43 } 44 45 Rsync_Status() { 46 if [ $Rsync_Port -eq 1 ] 47 then 48 echo "Rsync 服務運行中..." 49 else 50 echo "Rsync 服務未運行" 51 fi 52 } 53 54 Rsync_Restart() { 55 Rsync_Stop 56 Rsync_Start 57 } 58 COMMAND=$1 59 60 case "$COMMAND" in 61 start) 62 Rsync_Start 63 ;; 64 stop) 65 Rsync_Stop 66 ;; 67 status) 68 Rsync_Status 69 ;; 70 restart|reload|force-reload) 71 Rsync_Restart 72 ;; 73 *) 74 echo $"Usage: $0 {start|stop|status|restart|reload|force-reload}" 75 exit 2 76 esac
腳本執行過程
1.4.3 【練習題3】菜單自動化軟件部署腳本實踐
綜合實例:打印選擇菜單,按照選擇一鍵安裝不同的Web服務。
示例菜單:
[root@oldboy scripts]# sh menu.sh
1.[install lamp]
2.[install lnmp]
3.[exit]
pls input the num you want:
要求:
1、當用戶輸入1時,輸出“start installing lamp.提示”然后執行/server/scripts/lamp.sh,腳本內容輸出"lampis installed"后退出腳本,工作中就是正式lamp一鍵安裝腳本;
echo 'echo lampis installed' > /server/scripts/lamp.sh chmod +x /server/scripts/lamp.sh
2、當用戶輸入2時,輸出“start installing lnmp.提示” 然后執行/server/scripts/lnmp.sh輸出"lnmpis installed"后退出腳本,工作中就是正式lnmp一鍵安裝腳本;
echo 'echo lnmpis installed' > /server/scripts/lnmp.sh chmod +x /server/scripts/lnmp.sh
3、當輸入3時,退出當前菜單及腳本;
4、當輸入任何其它字符,給出提示“Input error”后退出腳本;
5、要對執行的腳本進行相關的條件判斷,例如:腳本文件是否存在,是否可執行等判斷。
腳本 內容

1 [root@clsn scripts]# cat menu.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: menu.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-07 19:29:30 9 # Description: 10 ############################################################# 11 12 cat <<EOF 13 1.[install lamp] 14 2.[install lnmp] 15 3.[exit] 16 EOF 17 18 read -p "please input the num you want:" Num 19 20 case "$Num" in 21 1) 22 if [ -f /server/scripts/lamp.sh ] 23 then 24 echo -e "\033[36mstart installing lamp\033[0m" 25 /server/scripts/lamp.sh 26 else 27 echo -e "\033[5;41;37m /server/scripts/lamp.sh 文件不存在 \033[0m" 28 fi 29 ;; 30 2) 31 if [ -f /server/scripts/lnmp.sh ] 32 then 33 echo -e "\033[36mstart installing lnmp\033[0m" 34 /server/scripts/lnmp.sh 35 else 36 echo -e "\033[5;41;37m /server/scripts/lnmp.sh 文件不存在 \033[0m" 37 fi 38 ;; 39 3) 40 exit 41 ;; 42 *) 43 echo -e "\033[31mInput error \033[0m" 44 exit 2 45 esac
執行過程
1.4.4 if 與 case 對比
if 語句類似黑名單,需要把這種錯誤場景封堵
case 語句類似白名單,只要把正確結果列完整即可
1.5 其他補充說明
1.5.1 linux中產生隨機數的方法
[root@clsn scripts]# echo $RANDOM 29291 [root@clsn scripts]# echo $RANDOM 5560 [root@clsn scripts]# echo $RANDOM 2904
1.5.2 echo 命令輸出帶顏色字符
# 彩色字體
echo -e "\033[30m 黑色字 clsn \033[0m" echo -e "\033[31m 紅色字 clsn \033[0m" echo -e "\033[32m 綠色字 clsn \033[0m" echo -e "\033[33m 黃色字 clsn \033[0m" echo -e "\033[34m 藍色字 clsn \033[0m" echo -e "\033[35m 紫色字 clsn \033[0m" echo -e "\033[36m 天藍字 clsn \033[0m" echo -e "\033[37m 白色字 clsn \033[0m"
效果示意圖
# 彩色底紋
echo -e "\033[40;37m 黑底白字 clsn \033[0m" echo -e "\033[41;37m 紅底白字 clsn \033[0m" echo -e "\033[42;37m 綠底白字 clsn \033[0m" echo -e "\033[43;37m 黃底白字 clsn \033[0m" echo -e "\033[44;37m 藍底白字 clsn \033[0m" echo -e "\033[45;37m 紫底白字 clsn \033[0m" echo -e "\033[46;37m 天藍白字 clsn \033[0m
效果示意圖
# 特效字體
\033[0m 關閉所有屬性 \033[1m 設置高亮度 \033[4m 下划線 \033[5m 閃爍 \033[7m 反顯 \033[8m 消隱 \033[30m — \033[37m 設置前景色 \033[40m — \033[47m 設置背景色 \033[nA 光標上移 n 行 \033[nB 光標下移 n 行 \033[nC 光標右移 n 行 \033[nD 光標左移 n 行 \033[y;xH 設置光標位置 \033[2J 清屏 \033[K 清除從光標到行尾的內容 \033[s 保存光標位置 \033[u 恢復光標位置 \033[?25l 隱藏光標 \033[?25h 顯示光標
部分效果示意圖
1.5.3 顯示文本中的隱藏字符
使用cat命令查看文本中的隱藏字符
[root@clsn ~]# cat --help 用法:cat [選項]... [文件]... 將[文件]或標准輸入組合輸出到標准輸出。 -A, --show-all 等於-vET -b, --number-nonblank 對非空輸出行編號 -e 等於-vE -E, --show-ends 在每行結束處顯示"$" -n, --number 對輸出的所有行編號 -s, --squeeze-blank 不輸出多行空行 -t 與-vT 等價 -T, --show-tabs 將跳格字符顯示為^I -u (被忽略) -v, --show-nonprinting 使用^ 和M- 引用,除了LFD和 TAB 之外
使用cat -A查看隱藏的字符
[root@clsn ~]# cat -A /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4$ ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6$ 10.0.0.1 mirrors.aliyuncs.com mirrors.aliyun.com$ 10.0.0.180 clsn$
關於隱藏字符常見錯誤
在windows中編寫的腳本換行使用的是 \r\n
但是在linux中使用\n 進行換行
[root@clsn ~]# cat -A windowe.sh n1=2^M$ n2=1^M$ ^M$ [ $n1 -gt $n2 ] && echo "$n1 > $n2" && exit^M$ [ $n1 -eq $n2 ] && echo "$n1 = $n2" && exit^M$ echo "$n1 < $n2"^M$
使用dos2unix 把windows上的腳本轉化linux格式
[root@clsn ~]# dos2unix windowe.sh dos2unix: converting file windowe.sh to Unix format ...
轉換后,腳本的內容隱藏內容改變。
[root@clsn ~]# cat -A windowe.sh n1=2$ n2=1$ $ [ $n1 -gt $n2 ] && echo "$n1 > $n2" && exit$ [ $n1 -eq $n2 ] && echo "$n1 = $n2" && exit$ echo "$n1 < $n2"$
1.5.4 排錯技巧
sh -x 腳本.sh
-x 開啟腳本調試模式
cat -A 文件.txt
-A 查看文件的隱藏字符
1.5.5 shell 腳本段注釋方法
方法一:
<<EOF
內容
EOF
方法二:
一行注釋方法 → : '內容' 段注釋方法 ↓ :' http://blog.znix.top '
:命令的說明
[root@clsn scripts]# help : :: : 空的命令。 沒有效果; 此命令不做任何操作。 退出狀態: 總是成功。
:命令的應用場景
if 條件 then : else 命令 fi
1.5.6 其他補充
類進度條效果
yum install -y pv
echo {1..20}|pv -qL 15
clear 命令
清屏 == ctrl + l
1.6 參考文獻
http://man.linuxde.net/curl https://www.abcdocker.com/abcdocker/206 http://www.cnblogs.com/clsn/p/7750615.html http://blog.51cto.com/oldboy/1867160 (部分練習題目來源)
本文出自“慘綠少年”,歡迎轉載,轉載請注明出處!http://blog.znix.top