until 迴圈

  1. while 直到 condition 條件不成立時才停止,until 則當 condition 條件成立時終止迴圈,否則持續進行迴圈的程式段。
    until [ condition ]
    do
    	程式段落
    done
    
  2. 例題:將 sh13.sh 的 while 迴圈改為 until,隨機產生一個 0 到 9 的數字,使用者輸入數字直到猜中為止。
    [dywang@dywmac zzz]$ cat sh13-1.sh 
    #!/bin/bash
    rnum=$((RANDOM%10))
    num="-10"
    count=0
    until [ "$rnum" -eq "$num" ]; do
    	read -p "請輸入一個 0 到 9 的數字: " -t 5 num
    	((count++))
    done
    echo "你答對了,隨機數字 $num,你猜了 $count 次。"
    
  3. 執行結果。
    [dywang@dywmac zzz]$ sh sh13-1.sh
    請輸入一個 0 到 9 的數字: 4
    請輸入一個 0 到 9 的數字: 6
    請輸入一個 0 到 9 的數字: 5
    你答對了,隨機數字 5,你猜了 3 次。
    [dywang@dywmac zzz]$ 
    [dywang@dywmac zzz]$ sh sh13-1.sh
    請輸入一個 0 到 9 的數字: 1
    請輸入一個 0 到 9 的數字: 2
    請輸入一個 0 到 9 的數字: 3
    請輸入一個 0 到 9 的數字: 4
    請輸入一個 0 到 9 的數字: 5
    請輸入一個 0 到 9 的數字: 6
    你答對了,隨機數字 6,你猜了 6 次。
    
  4. 例題:將 sh14.sh 的 while 迴圈改為 until,逐行讀入一個以逗號 "," 分隔欄位的 csv 檔,再計算平均成績。
    [dywang@dywmac zzz]$ cat sh14-1.sh
    #!/bin/bash
    [ -z "$1" ] && echo "Usage: $0 <datafile>" && exit 1
    ! test -f "$1" && echo "Input file not found" && exit 2
    until ! 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
    
  5. 執行結果。
    [dywang@dywmac zzz]$ sh sh14-1.sh 
    Usage: sh14-1.sh <datafile>
    [dywang@dywmac zzz]$ sh sh14-1.sh sdata.csv 
    name	avg.
    dywang	46
    linda	74
    peter	83
    rita	49
    cora	45