while循環、break、continue、exit

一 while循環

語法 while 條件; do … ; done
案例1:每隔30s檢查下系統負載,當系統負載大於10,就發送郵件

分析:若是不用while循環,咱們只能使用任務計劃cron,但這樣的最小時間是1分鐘,達不到隔30s檢查一次的要求shell

#!/bin/bash
while :   //這裏的:冒號能夠用true代替,寫的是死循環
do
    load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1`  //給負載load賦值
    if [ $load -gt 10 ]
    then
        top|mail -s "load is high: $load" asldkfls@11.com
    fi
    sleep 30
done

像這種死循環的腳本,爲了避免讓他意外的終止,咱們能夠打開一個screen來運行他
咱們來解析下上面案例中的命令w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1vim

[root@lijie-01 ~]# w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1
0
[root@lijie-01 ~]# w         //查看負載
 06:56:07 up 13:59,  2 users,  load average: 0.05, 0.03, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.75.1     04:52   10:39   0.66s  0.40s vim while.sh
root     pts/2    192.168.75.1     05:57    7.00s  0.10s  0.00s w
[root@lijie-01 ~]# uptime   //截取負載信息的第一行
 06:56:12 up 13:59,  2 users,  load average: 0.04, 0.03, 0.05
[root@lijie-01 ~]# w|head -1    //效果等同於上面一條命令
 07:04:21 up 14:07,  2 users,  load average: 0.00, 0.01, 0.05
[root@lijie-01 ~]# uptime|awk -F 'load average:' '{print $2}'   //以load average:做爲分隔符截取負載信息第一行的第二段
 0.02, 0.02, 0.05
[root@lijie-01 ~]# uptime|awk -F 'load average:' '{print $2}'|cut -d. -f1   //再以.做爲分隔符截取第一段
 0
[root@lijie-01 ~]# uptime|awk -F 'load average: ' '{print $2}'|cut -d. -f1   //load average: 後面加上空格以去掉上面一條命令運行結果前面的0
0
[root@lijie-01 ~]# uptime|awk -F 'load average:' '{print $2}'|cut -d. -f1|sed 's/ //'   //也能夠再用 sed 's/ //'過濾一次以去掉上面一條命令運行結果前面的0
0

咱們還能夠寫成bash

#!/bin/bash
while true
do
   load='w|head -1|awk -F `load average: ` `{print $2}` |cut -d. -f1'
   if [ $load -gt 10 ]
   then
     /usr/lib/zabbix/alertscripts/mail.py xxx@qq.com "load high" " $load"
   fi
   sleep 30
done

運行結果出錯code

[root@lijie-01 shell]# sh while.sh
while.sh: 第 5 行:[: 參數太多

咱們來排查錯誤,發現load賦值語句的引號有問題,修改後提示如下錯誤對象

[root@lijie-01 shell]# sh while.sh
while.sh:行4: average:: 未找到命令
while.sh: 第 5 行:[: -gt: 期待一元表達式
^[while.sh:行4: average:: 未找到命令
while.sh: 第 5 行:[: -gt: 期待一元表達式
while.sh:行4: average:: 未找到命令
while.sh: 第 5 行:[: -gt: 期待一元表達式

結果發現load賦值語句是系統命令,最外層應該使用反引號 ,修改後再運行,因爲咱們寫的是死循環,所以腳本處於一直運行的狀態,以下:ip

[root@lijie-01 shell]# sh while.sh

爲了能更明顯的觀察到現象,咱們將腳本修改成當負載小於10發送郵件input

[root@lijie-01 shell]# cat !$
cat while.sh
#!/bin/bash
while :
do
   load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1`
   if [ $load -lt 10 ]
   then
     /usr/lib/zabbix/alertscripts/mail.py 476189605@qq.com "load high" " $load"
   fi
   exit
done

過了30s後,就正常收到郵件了
while循環案例2:作一個讓用戶不停輸入咱們想要東西的腳本

[root@lijie-01 shell]# cat !$
cat while2.sh
#!/bin/bash
while :
do 
  read -p "Please input a number: " n
     if [ -z "$n" ]
     then
        echo "你尚未輸入的,請輸入!"
        continue
     fi
     n1=`echo $n|sed 's/[0-9]//g'`
     if [ ! -z "$n1" ]
     then
        echo "你須要輸入一個純數字!"
        continue
     fi
     break
done
echo $n

下面來執行it

[root@lijie-01 shell]# sh -x while2.sh
+ :
+ read -p 'Please input a number: ' n
Please input a number: 
+ '[' -z '' ']'
+ echo '你尚未輸入的,請輸入!'
你尚未輸入的,請輸入!
+ continue
+ :
+ read -p 'Please input a number: ' n
Please input a number: 12324dfff
+ '[' -z 12324dfff ']'
++ sed 's/[0-9]//g'
++ echo 12324dfff
+ n1=dfff
+ '[' '!' -z dfff ']'
+ echo '你須要輸入一個純數字'
你須要輸入一個純數字
+ continue
+ :
+ read -p 'Please input a number: ' n
Please input a number: 3425
+ '[' -z 3425 ']'
++ sed 's/[0-9]//g'
++ echo 3425
+ n1=
+ '[' '!' -z '' ']'
+ break
+ echo 3425
3425
[root@lijie-01 shell]#

二 break跳出循環

break用於循環語句中awk

#!/bin/bash 
for i in `seq 1 5`
do
    echo $i
    if [ $i == 3 ]     //若是是數字間的比較,能夠使用-eq;若是比較的對象包含數字外的其餘字符,則必需要使用==來比較
    then
        break
    fi
    echo $i
done
echo abc

執行過程以下:sed

[root@lijie-01 shell]# sh -x break.sh
++ seq 1 5
+ for i in '`seq 1 5`'
+ echo 1
1
+ '[' 1 == 3 ']'
+ for i in '`seq 1 5`'
+ echo 2
2
+ '[' 2 == 3 ']'
+ for i in '`seq 1 5`'
+ echo 3
3
+ '[' 3 == 3 ']'
+ break
+ echo abc
abc
[root@lijie-01 shell]#

三 continue結束本次循環

忽略continue之下的代碼,直接進行下一次循環

#!/bin/bash 
for i in `seq 1 5`
do
    echo $i
    if [ $i == 3 ]    
    then
        continue   //當i=3時,跳出本次循環
    fi
    echo $i
done
echo abc

執行過程以下:

[root@lijie-01 shell]# sh continue.sh 
1
1
2
2
3
4
4
5
5
abc
[root@lijie-01 shell]#

四 exit退出整個腳本

[root@lijie-01 shell]# cat !$
cat exit.sh
#!/bin/bash
for i in `seq 1 5`
do 
  echo $i
  if [ $i == 3 ]
  then
    exit 2
  fi
  echo $i
done
echo abc
[root@lijie-01 shell]# sh exit.sh 
1
1
2
2
3
[root@lijie-01 shell]# echo $?
2
[root@lijie-01 shell]#
相關文章
相關標籤/搜索