shell的while和until 的用法


shell while循環工作中使用的不多,一般適用於守護進程程序或始終循環執行場景,其他循環計算等。

while條件句:

語法:

while 條件
         do
          指令…
done

 ok,我們測試一下:

測試:每隔2秒屏幕輸出系統負載值。

[root@bqh-118 scripts]# vim while.sh 
while true    #條件為真時,也可以用 "[1]"代替
do
  uptime      #查看系統負載情況
  sleep 2     #2秒后
done

提示:while true 表示條件永遠為真,因此會一直運行,像死循環一樣,每隔2秒查看一下系統負載情況,但我們稱呼為守護進程。

接下來我們來一個稍微難一點的:計算從1+到100之和(1+2+3+4+......100)的方法

[root@bqh-118 scripts]# vim while1_100sum.sh 
#!/bin/sh
#no.1
i=1
sum=0
while [ $i -le 100  ]  #當i小於100時,往下執行
do
 ((sum=sum+i))         #sum+變量i
 ((i++))               #執行一次循環i+1,直到條件不成立為止。
done
echo $sum              #輸出總和sum
#no.2                        #數據公式計算 
a=100
((sum=a*(a+1)/2))
echo $sum

更多方法詳情去:https://blog.51cto.com/oldboy/767862

================================================================

until循環語句:until應用場景不多。(屬於先執行后判斷,類似於先上車,后補票。)

語法:

until 條件
         do
          指令...
done

測試:

[root@bqh-118 scripts]# vim while1_100sum.sh 
#!/bin/sh
a=5
until [[ $a < 1 ]]  #當a不小於1時,執行循環,注意判斷是單[]須轉義加\或用其他方法
do
  echo "My name is bqh!"
  ((a--))                  #執行一次循環變量a遞減一次
done

提示:以上語句中5<1不成立那么就開始循環,直到小於1時停止,注意要用"[[]]"或"-lt"判斷

ok,我們來調整一個實戰測試吧:

1、編寫手機業務一鍵服務腳本

 

  1 [root@bqh-118 scripts]# vim sjyjcx.sh 
  2 #!/bin/sh
  3 #date:2019-04-25
  4 #author:aゞ錦衣衛
  5 #script function:Mobile phone recharge query service
  6 menu() {          #定義菜單函數
  7  cat <<bqh
  8 ==========================================
  9     Mobile phone recharge query service   
 10 ------------------------------------------
 11      1.話費充值                           
 12      2.余額查詢                           
 13      3.發送短信                           
 14      4.退出服務                           
 15                          
 16                          author:aゞ錦衣衛
 17                          date:2019-04-25  
 18 ==========================================
 19 bqh
 20 }
 21 
 22 TOTAL=0      #定義總額
 23 MSG=1        #定義一條短信1元
 24 green='\e[1;32m'       #綠色
 25 red='\e[1;31m'         #紅色
 26 yelow='\e[1;33m'       #黃色
 27 shan='\e[31;5m'        #閃爍紅
 28 res='\e[0m'            #清除顏色
 29 
 30 judge() {     #定義判斷函數
 31  read -p "請輸入您要辦理的業務:" num
 32  expr $num + 1 &>/dev/null
 33    if [ "$?" -ne 0 ];then
 34       echo -e "${shan}請您輸入{1|2|3|4}${res}"
 35       exit
 36    fi
 37 }
 38 
 39 recharge() {     #定義充值話費函數
 40  while  :
 41   do
 42    read -p "請輸入您要充值的金額:" a
 43    expr $a + 1 &>/dev/null           #檢測變量a是否為整數
 44    if [ "$?" -ne 0 ];then
 45         echo -e "${shan}充值失敗!${res}"
 46         echo -e "${shan}請輸入數值!${res}"
 47         exit 2
 48    else
 49         ((TOTAL+=a)) && echo "充值中....." && sleep 1
 50         echo -e "${green}充值成功!\n目前您的余額為$TOTAL元!${res}"    
 51         return 1   #退出當前函數
 52    fi
 53   done
 54 }
 55 
 56 query() {   #定義查詢余額函數
 57    echo -e "${green}您好!您當前的余額為:$TOTAL元${res}"
 58 }
 59 
 60 sending_sms() {   #定義發送短信函數
 61    if [ "$TOTAL" -lt "$MSG" ];then   #判斷是否有足夠的錢支持本次發送短信服務
 62         echo -e "${shan}很抱歉,由於您余額不足本次發送,請您及時充值。${res}"
 63    else
 64         read -p "請輸入您要發送的內容:" txt
 65         read -p "您確定是否發送?{y/n}" select
 66 case "$select" in     #判斷用戶最終是否確定發送短信
 67         [yY]|[yY][eE][sS])
 68         echo -e "${yelow}$txt${res}"&& echo "正在發送......"
 69         sleep 1
 70         echo -e "${green}發送成功!${res}"
 71 ;;
 72         [nN]|[nN][oO])
 73         echo -e "${green}取消發送!${res}"
 74 ;;
 75         *)
 76         echo -e "${shan}很抱歉,由於您操作有誤,暫不支持本次發送!${res}"
 77 ;;
 78 esac
 79    fi
 80 }
 81 
 82 server() {   #定義辦理業務函數
 83 while :
 84 do
 85   menu && judge
 86     case "$num" in     根據用戶輸入的變量num,並給出相應的服務。
 87         1)       
 88         recharge
 89 ;;
 90         2)
 91         query
 92 ;;
 93         3)
 94         sending_sms
 95 ;;
 96         4)
 97         echo -e "${green}感謝您使用一鍵查詢服務。${res}"
 98         exit 177
 99 ;;
100 
101         *)
102         echo -e "${shan}請您輸入{1|2|3|4}${res}"
103         exit 188
104 ;;
105      esac
106 done
107 }
108 server     #調用辦理業務函數

執行效果如下:

 ------------------------------------------------------------------------------------------------------------------------------------

各語句常用於場景:

條件表達式:簡單的判斷(文件是否存在/字符串是否為空等等)

if語句:取值判斷,不同值數量較少的情況

while:守護進程、無限循環(sleep)

case:服務啟動腳本、菜單等

for:正常的循環處理,最常用。

while 循環總結:

1、while 循環的特征是執行守護進程以及我們希望可持續執行的環境,用於頻率小於1分鍾的循環處理,其他的while循環幾乎都可以被for循環代替。

2、幾乎所有的case語句都可以用if語句代替,case語句常用於系統腳本啟動,其他普通判斷多用於if語句。

3、if和for語句最常用,其次while(守護進程)和case(服務啟動腳本)。

·····································································································································

因小柏目前水平有限,正在努力學習中,寫的不好,路過的大佬多多指教,謝謝。


免責聲明!

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



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