Shell編程基礎篇-下


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 f2nt 的全拼為 newer than

文件fl比文件f2新則為真,即測試表達式成立。根據文件的修改時間來計算

fl -ot f2ot 的全拼為 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 ]

AB都要成立,整個表達式才成立

&&

and,與,兩端都為真,則結果為真

-o

[ 條件A -o  條件B]

AB都不成立,整個表達式才不成立

||

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
View Code read方法 單分支

示例腳本二:

 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
View Code 雙分支

示例腳本三:

 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
View Code 多分支

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
View Code nginx 啟動腳本

腳本執行過程: 

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
View Code web 監控腳本內容

腳本執行過程:

 

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
View Code 菜單腳本內容

腳本執行過程:

 

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
View Code 水果菜單腳本

腳本執行過程:

 

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
View Code 監控 memcached腳本

腳本執行過程

 

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
View Code rsync 服務管理腳本

腳本執行過程

 

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
View Code 自動化軟件部署腳本

執行過程

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM