next up previous contents
Next: until 迴圈 Up: 迴圈 Previous: for 迴圈   Contents

while 迴圈

  1. for 迴圈有固定數量的次數,while 不固定迴圈次數,直到 condition 條件不成立時才停止,語法如下:
    while [ condition ]
    do
    	程式段落
    done
    
  2. 例題:隨機產生一個 0 到 9 的數字,使用者輸入數字直到猜中為止。
    [dywang@dywmac zzz]$ vim sh13.sh
    [dywang@dywmac zzz]$ cat sh13.sh
    #!/bin/bash
    rnum=$((RANDOM%10))
    num="-10"
    count=0
    while [ "$rnum" -ne "$num" ]; do
    	read -p "請輸入一個 0 到 9 的數字: " -t 5 num
    	((count++))
    done
    echo "你答對了,隨機數字 $num,你猜了 $count 次。"
    
  3. 執行結果。
    [dywang@dywmac zzz]$ sh sh13.sh 
    請輸入一個 0 到 9 的數字: 5
    你答對了,隨機數字 5,你猜了 1 次。
    [dywang@dywmac zzz]$ sh sh13.sh 
    請輸入一個 0 到 9 的數字: 5
    請輸入一個 0 到 9 的數字: 3
    你答對了,隨機數字 3,你猜了 2 次。
    [dywang@dywmac zzz]$ sh sh13.sh 
    請輸入一個 0 到 9 的數字: 6
    請輸入一個 0 到 9 的數字: 5
    請輸入一個 0 到 9 的數字: 4
    請輸入一個 0 到 9 的數字: 3
    請輸入一個 0 到 9 的數字: 2
    請輸入一個 0 到 9 的數字: 1
    請輸入一個 0 到 9 的數字: 8
    你答對了,隨機數字 8,你猜了 7 次。
    
  4. 先產生如下 sdata.csv 檔,每個欄位以逗號 "," 隔開。
    [dywang@dywmac zzz]$ cat sdata.csv
    no.,name,score1,score2,grade
    11,dywang,81,12,A
    152,linda,90,58,C
    33,peter,72,95,C
    4,rita,65,34,E
    58,cora,5,85,D
    
  5. 例題:使用 while 逐行讀入一個以逗號 "," 分隔欄位的 csv 檔,再計算平均成績。IFS=',' 設定逗號為欄位分隔符號,read -r 選項關閉倒斜線 "\" 跳脫動作,f1 f2... 指定各欄位依序放在 f1 f2 .. 等變數。
    [dywang@dywmac zzz]$ cat sh14.sh 
    #!/bin/bash
    [ -z "$1" ] && echo "Usage: $0 <datafile>" && exit 1
    ! test -f "$1" && echo "Input file not found" && exit 2
    while IFS=',' read -r f1 f2 f3 f4 f5; do
    	[ "$f1" == "no." ] && echo -e "name\tavg." && continue
    	avg=$(((f3+f4)/2))
    	echo -e "$f2\t$avg"
    done < $1
    
  6. 執行結果。
    [dywang@dywmac zzz]$ sh sh14.sh
    Usage: sh14.sh <datafile>
    
    [dywang@dywmac zzz]$ sh sh14.sh sdata.csv
    name	avg.
    dywang	46
    linda	74
    peter	83
    rita	49
    cora	45
    



De-Yu Wang 2019-06-27