1. 程式人生 > >while和until循環的應用實踐

while和until循環的應用實踐

ack water toolbar utf-8 手機 服務器 會話狀態 cto kill

10.1 當型和直到型循環語法


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循環的應用實踐