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 #最後調用總的函數
不夠養眼?沒有關係,圖片如下:
運行結果如下: