Shell編程之while&until迴圈詳解(代碼執行個體),shellwhile

來源:互聯網
上載者:User

Shell編程之while&until迴圈詳解(代碼執行個體),shellwhile

迴圈語句命令常用於執行一條指令或者一組指令,那麼直到條件不在滿足時停止,在shell指令碼中迴圈語句常見有 while until for select迴圈語句。

在while迴圈語句主要用來重複執行一組命令或語句,在企業實際應用中,常用於守護進程持續啟動並執行程式。

1、在這麼多語句中,while迴圈有它的文法格式,如下:

while <條件運算式>do   指令.....done

看到上面的文法感覺還是不明白?沒有關係一句話解釋:while迴圈語句會對緊跟在while後面的條件運算式進行判斷,那麼如果該條件運算式成立,則運行while迴圈體裡面的命令或者語句,每一次執行到done時,就會重新判斷while條件運算式是否成立,直到條件運算式不成立時才會退出while迴圈

看瞭解釋還是不明白? 沒有關係如下:

#!/bin/bashwhile ((5>3))do        echo "yes yes yes"done

刨析:我們可以看到以上就是一組while迴圈,那麼在while後面跟著 ((5>3)),這個就叫做條件運算式,也就是說,如果5>3成立了,那麼執行下面的echo "yes yes yes" 最後當我們的文法執行到了done 它還會繼續來判斷5是否大於3 那麼按照我們上面的while迴圈,這稱為死迴圈!!! 因為5這輩子都是大於3 那麼成立了就會一直輸出 yes

輸入結果如下:

好,到這裡應該瞭解了while迴圈的基本操作了;

2、在這裡我們先瞭解一下linux中的sleep命令,sleep 1代表休息一秒,sleep 2代表休息2秒 如下:

#!/bin/bashwhile ((5>3))do        sleep 2        echo "yes yes yes"done

剖析:如果5>3這個條件是成立的,那麼在2秒後輸出 yes yes yes

3、將負載值追加到log檔案中

#!/bin/bashwhile [ 1 ]do        sleep 2        date >> /root/logdone

在這裡date是擷取當前的時間,那麼在while後面跟了一個 [ 1 ]這個就代表著這個條件永遠都是真的。

4、shell指令碼在後台運行

例1:

解釋如下:

[root@shell-yankerp ~]# sh a.sh &     #運行a.sh 在後台運行[1] 66727[root@shell-yankerp ~]# fg            #把後台啟動並執行指令碼放到前台運行,如果有多個後台啟動並執行話,+編號提出sh a.sh^Z                                     #使用ctrl + z來暫停當前的指令碼任務[1]+  已停止               sh a.sh[root@shell-yankerp ~]# bg             #使用bg放在後台運行[1]+ sh a.sh &[root@shell-yankerp ~]# jobs           #使用jobs來查看後台啟動並執行指令碼[1]+  運行中               sh a.sh &[root@shell-yankerp ~]# fg 1           #fg加編號把後台啟動並執行指令碼放置前台sh a.sh^Z                                    #執行ctrl + z停止指令碼任務[1]+  已停止               sh a.sh[root@shell-yankerp ~]# jobs          #使用jobs來查看後台運行指令碼任務[1]+  已停止               sh a.sh[root@shell-yankerp ~]# kill %1       #使用kill + %編號停止運行任務[1]+  已停止               sh a.sh[root@shell-yankerp ~]# jobs          #jobs再次查看[1]+  已終止               sh a.sh[root@shell-yankerp ~]#

圖片說明:

4、使用while迴圈列印5-1

#!/bin/basha=5while (($a>0))do        echo $a        ((a--))done

剖析:

a=5是一個變數

while (($a>0)) 也相當於((5>0)) 在這裡5肯定>0啊 條件成立

do

echo $a 這裡就是5 4 3 2 1 直到條件不成立退出迴圈

((a--)) 每一次迴圈 5就 減去1 那麼一直迴圈到5-1 4-1 3-1 2-1 1-1 那麼到了1-1=0了 以上條件 0 > 0 不成立 退出迴圈

done

輸出如下:

[root@shell-yankerp ~]# sh a.sh  [root@shell-yankerp ~]#

應該可以理解,繼續使用雙中括弧示範

#!/bin/basha=5while [[ $a>0 ]]do        echo $a        ((a--))done

輸出如下:

[root@shell-yankerp ~]# sh a.sh   [root@shell-yankerp ~]# 

還有[]號 [ $a -gt 0 ] 這裡不在做示範~~~

二、until迴圈

其實until迴圈和while迴圈是相反的,也就是說,當條件運算式不成立時,就會進入迴圈如下:

#!/bin/basha=5until [[ $a < 1 ]]do        echo $a        ((a--))done

以上 a=5 $a就是5 那麼在以上語句中5<1不成立那麼就會進入迴圈,也就是它是反著的,輸出如下:

需求:從1加到100 請用 1+2+3+4這樣的計算,如下:

#!/bin/basha=1b=0while (($a <= 100))do        ((b=b+a))        ((a++))doneecho $b

什麼意思呢解釋如下:

#!/bin/basha=1      #這是一個變數 a=1 那麼a就是1b=0      #b呢 就是0while (($a <= 100))      #如果$a <= 100 也就是說 1 <= 100 條件成立 1<=100do        ((b=b+a))        #b=b+a 意思是: b這個變數等於0+1         ((a++))  #a++的意思是 迴圈一次a就+1 如果不加的話那麼條件一直成立就是死迴圈doneecho $b#==================================================================================================#計算b=b+a 相當於 0+1  迴圈到下面 a++ 也就是1+1=2 執行到done 那麼再次迴圈 這裡的a等於2了 那麼就是0+1+2+3+4+5+6+.....

圖片解釋

輸出結果如下:

[root@shell-yankerp ~]# sh a.sh 5050[root@shell-yankerp ~]#

希望讀者能懂吧,剛開始確實挺繞,慢慢的就好了

while迴圈到底有什麼用,不會就是上面的去加減吧。實戰如下:

1、編寫沖手機話費指令碼

在書上也有這樣的例子,但是我還是按照自己的想法寫出來 如下:

#!/bin/bashred_col="\e[1;31m"reset_col="\e[0m". /etc/init.d/functions zongjia=30duanxin=15function caidan(){cat </dev/null                if [ "$" -ne 0 ]                   then                        echo  "請您輸入{1|2|3|4}"                   exit 1                fi}function cxdx(){        echo "您好,帥哥,您當前的餘額剩餘:$zongjia"}function fdx(){        while :        do        if [ "$zongjia" -lt $duanxin ];then                action "您當前的餘額不足,請儲值!!!" /bin/false                return 1        else                read -p "請您輸入你要發送的內容:" aaa                zongjia=$((zongjia-duanxin))                        echo "發送成功,當前的餘額剩餘:$zongjia"  return 1                fidone}function czhf(){        while :        do                read -p "請您輸入你要儲值的餘額:" bbb                expr $bb + 1 &>/dev/null                if [ "$" -ne 0 ];then                        action "請您輸入數值" /bin/false                exit 1                else                   zongjia=$((zongjia+$bbb))                        echo "儲值成功,當前的餘額剩餘:$zongjia"                        return 1                fidone}function exit (){        exit 0}function zong(){while :do      caidan && panduan        case $NUM in                1)                cxdx                ;;                2)                fdx                ;;                3)                czhf                ;;                4)                exit                 ;;        esacdone}zong

看不懂沒關係,解釋如下:

#!/bin/bashred_col="\e[1;31m"  #定義red變數 這個就是為了一個紅色reset_col="\e[0m"    #這個也是. /etc/init.d/functions  #載入functions函數庫zongjia=30     #總價為30元duanxin=15     #一條簡訊為15元function caidan(){  #定義菜單函數 cat </dev/null   #判斷使用者輸入的是否是數值                if [ "$" -ne 0 ]   #如果不是數值                   then   #那麼                        echo  "請您輸入{1|2|3|4}"  #輸出這條內容                   exit 1 #最後退出指令碼                fi}function cxdx(){       #定義查詢簡訊函數        echo "您好,帥哥,您當前的餘額剩餘:$zongjia" #echo 輸出此內容}function fdx(){ #定義發簡訊的函數        while :       #while迴圈        do        if [ "$zongjia" -lt $duanxin ];then #如果總價格小於一條簡訊的價格                action "您當前的餘額不足,請儲值!!!" /bin/false #那麼輸出此內容                return 1     #退出函數        else    #否則                read -p "請您輸入你要發送的內容:" aaa  #等待使用者內容賦值給aaa                zongjia=$((zongjia-duanxin))        #總價=總價-一條簡訊的價格                        echo "發送成功,當前的餘額剩餘:$zongjia"   #最後輸出總價格                        return 1  #退出此函數                fidone}function czhf(){  #定義儲值話費函數        while : #while迴圈        do                read -p "請您輸入你要儲值的餘額:" bbb  #等待使用者內容賦值給bbb                expr $bb + 1 &>/dev/null     #檢查使用者輸入的是否為數值                if [ "$" -ne 0 ];then    #如果不是數值                        action "請您輸入數值" /bin/false #那麼輸出一條請您輸入數值                exit 1 #退出                else   #否則                   zongjia=$((zongjia+$bbb))  #總價=總價+使用者輸入的價格                        echo "儲值成功,當前的餘額剩餘:$zongjia" #最後輸出總價格                        return 1 #退出函數和while迴圈                fidone}function exit (){   #定義exit退出函數        exit 0      #退出}function zong(){ #定義總的函數while :           #while迴圈do      caidan && panduan    #調用菜單函數和判斷函數        case $NUM in      #如果在$NUM這個變數中輸入的是以下:                1)                       cxdx                           ;;                2)                fdx                ;;                3)                czhf                ;;                4)                exit                 ;;        esacdone}zong #最後調用總的函數

不夠養眼?沒有關係,圖片如下:

運行結果如下:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.