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(服務啟動腳本)。
·····································································································································
因小柏目前水平有限,正在努力學習中,寫的不好,路過的大佬多多指教,謝謝。