while和until循環的應用實踐
while時條件表達式成立之後,會進入循環體裏面執行,不成立時退出,until循環語句的用法於while類似,區別在於在條件表達式不成立時候,進入循環執行指令,條件表達式成立時,終止循環。很少用until
while <條件表達式>
do
指令....
done
當型和直到型循環的基本範例
每隔幾秒輸出一個系統負載,在腳本的結尾使用&符號在後臺運行
#!/bin/bash while true do uptime #uptime >> /tmp/load.txt sleep 3 done
在實際工作中,一般會通過客戶端ssh連接服務器,因此可能就會有在腳本或命令執行期間不能中斷的需求,若中斷,前功盡棄,更要命的會破壞系統數據,下面是防止腳本中斷的幾個可行方法;
1)利用 sh /server/scripts/while_01.sh & 命令,即使用&在後臺運行腳本
2)使用nohup /server/scripts/uptime.sh & 命令。即使用nohup加&在後臺運行腳本
3)利用screen保持會話,然後在執行命令或腳本,即使用screen保持當前會話狀態
1和2的差別在於,如果當前ssh遠程連接的shell界面斷開連接,1就會停止,而2不會停止
讓shell腳本在後臺運行的知識
用法 說明
sh while_01.sh 把腳本放到後臺執行(在後臺運行腳本的常用方法)
ctrl+c 停止執行當前腳本
ctrl+z 暫停執行當前腳本或任務
bg 把當前腳本或任務放到後臺執行,bg可以理解為background
fg 把當前腳本或任務放到前臺執行,
jobs 查看當前執行的腳本或者任務
kill 關閉執行的腳本任務,即以“kill % 任務編號”
豎向打印54321:
#!/bin/bash i=5 while (($i>0)) do echo $i ((i--)) done 或者: #!/bin/bash i=5 while [ $i -gt 0 ] do echo $i ((i--)) done 或者: #!/bin/bash i=5 while [[ $i > 0 ]] do echo $i ((i--)) done
也可以使用$1傳參的命令進行計算。
使用until進行判斷:
#!/bin/bash i=5 until [ $i -lt 1 ] do echo $i ((i--)) done
計算從1加到100之間(請使用1+2+3...+100的方法)
#!/bin/bash i=1 sum=0 while (($i<101)) do sum=$(($sum+$i)) ((i++)) done echo $sum
範例:猜數字遊戲,首先讓系統隨機生成一個數字,給這個數字設定一個範圍(1~60),讓用戶輸入所猜的數字,遊戲規則是:對輸入進行判斷,如果不符合要求,就給予高或低的提示,猜對後則給出所用的次數,請用while實現。
自己寫的簡易版本的: #!/bin/bash export LANG="zh_CN.UTF-8" a=$(($RANDOM%61)) b=1 echo "這個搟面皮"$a"元" sleep 2 echo "----------------" clear echo "這個面皮多錢?請輸入0-60的價格" read -p "請輸入你的價格:" num if [ $num -eq $a ]; then echo $b exit 1 else num1=$num fi while [ $num1 -ne $a ] do if [ $num1 -gt $a ]; then echo "這個價格有點高" elif [ $num1 -lt $a ]; then echo "這個價格有點低" else echo "恭喜你猜對了" return 0 fi read -p "再次輸入價格:" num1 ((b++)) done echo “你共猜了"$b"次才才猜對的,很笨”
範例10-5:手機充值10元,每發 一次短信(輸出當前余額)花費1角5分錢,當余額低於1角5分錢的時候就不能在發短信了,提示“余額不足,請充值”(允許用戶充值後繼續發短信),請用while語句實現。
目前寫的最專業,最好的腳本 #!/bin/bash export LANG="zh_CN.UTF-8" sum=15 #初始費用 b=15 #發一次短信需要的費用 me() { cat <<EOF 當前余額為$sum,余額不足,請充值 ============================== 1.充值 2.發消息 3.退出 ============================== EOF } chong() { read -p "請輸入充值金額:" num expr $num + 10 >/dev/null js=$? if [ $js -eq 0 ]; then sum=$(($sum+$num)) printf "充值成功,充了$num,現在還有"$sum"話費\n" else echo "這是一個錯誤的數字" # return 0 fi } send() { if [ $sum -ge 15 ]; then sum=$(($sum-$b)) printf "發送一條短信,現在還有“$sum”話費,請及時充值\n" else printf "余額不足,請充值\n" sleep 3 chong fi } main() { me while true do read -p "your choices:" dd case "$dd" in 1) chong ;; 2) send ;; 3) exit 5 ;; *) echo "this is a bad" esac done } main
while和until循環的應用實踐