next up previous contents
Next: shell script 的追蹤與 debug Up: Shell scripts - 條件判斷與迴圈 Previous: 條件判斷式   Contents

迴圈 (loop)

  • while....do....done, until....do....done
    1. 語法一:當 condition 條件成立時,進行迴圈,直到 condition 條件不成立才停止。
      while [ condition ]
      do
              程式段落
      done
      
    2. 語法二:當 condition 條件成立時,終止迴圈, 否則持續進行迴圈的程式段。
      until [ condition ]
      do
              程式段落
      done
      
    3. 例題:使用 while 語法,讓使用者輸入 yes 或者是 YES 才結束程式的執行,否則就一直進行告知使用者輸入字串。
      [root@linux scripts]# vi sh12.sh
      #!/bin/bash
      # Program:
      #       Use loop to try find your input.
      # History:
      # 2005/08/29    csie   First release
      
      while [ "$yn" != "yes" ] && [ "$yn" != "YES" ]
      do
              read -p "Please input yes/YES to stop this program: " yn
      done
      
    4. 例題:使用 until 語法,讓使用者輸入 yes 或者是 YES 才結束程式的執行,否則就一直進行告知使用者輸入字串。
      [root@linux scripts]# vi sh12-2.sh
      #!/bin/bash
      # Program:
      #       Use loop to try find your input.
      # History:
      # 2005/08/29    csie   First release
      
      until [ "$yn" == "yes" ] || [ "$yn" == "YES" ]
      do
              read -p "Please input yes/YES to stop this program: " yn
      done
      
    5. 例題:計算 1+2+3+....+100
      [root@linux scripts]# vi sh13.sh
      #!/bin/bash
      # Program:
      #       Try to use loop to calculate the result "1+2+3...+100"
      # History:
      # 2005/08/29    csie   First release
      
      s=0
      i=0
      while [ "$i" != "100" ]
      do
              i=$(($i+1))
              s=$(($s+$i))
      done
      echo "The result of '1+2+3+...+100' is ==> $s"
      
  • 已知進行迴圈次數:for...do...done
    1. 語法:
      for (( 初始值; 限制值; 執行步階 ))
      do
              程式段
      done
      
    2. for 括號內的三串內容意義為:
      1. 初始值:某個變數在迴圈當中的起始值,直接以類似 i=1 設定;
      2. 限制值:當變數的值在這個限制值的範圍內,就繼續進行迴圈。例如 i<=100
      3. 執行步階:每作一次迴圈時,變數的變化量。例如 i=i+1。
    3. 例題:1 累加到 100 的迴圈
      [root@linux scripts]# vi sh14.sh
      #!/bin/bash
      # Program:
      #       Try do calculate 1+2+....+100
      # History:
      # 2005/08/29    csie   First release
      
      s=0
      for (( i=1; i<=100; i=i+1 ))
      do
              s=$(($s+$i))
      done
      echo "The result of '1+2+3+...+100' is ==> $s"
      
    4. 非數字的迴圈
      for var in con1 con2 con3 ...
      do
              程式段
      done
      
      第一次迴圈時, $var 的內容為 con1 ; 
      第二次迴圈時, $var 的內容為 con2 ; 
      第三次迴圈時, $var 的內容為 con3 ; 
      ....
      
    5. 例題:假設有三種動物,分別是 dog, cat, elephant,想在每一行都輸出『There are dogs...』之類的字樣:
      [root@linux scripts]# vi sh15.sh
      #!/bin/bash
      # Program:
      #       Using for .... loop to print 3 animal
      # History:
      # 2005/08/29    csie   First release
      
      for animal in dog cat elephant
      do
              echo "There are ""$animal""s...."
      done
      
    6. 例題:讓使用者輸入某個目錄,然後找出該目錄內的所有檔名的權限:
      [root@linux scripts]# vi sh16.sh
      #!/bin/bash
      # Program:
      #       let user input a directory and find the whole file's permission.
      # History:
      # 2005/08/29    csie   First release
      
      # 1. 先看目錄是否存在?
      read -p "Please input a directory: " dir
      if [ "$dir" == "" ] || [ ! -d "$dir" ]; then
              echo "The $dir is NOT exist in your system."
              exit 1
      fi
      
      # 2. 開始測試檔案
      filelist=`ls $dir`
      for filename in $filelist
      do
              perm=""
              test -r "$dir/$filename" && perm="$perm readable"
              test -w "$dir/$filename" && perm="$perm writable"
              test -x "$dir/$filename" && perm="$perm executable"
              echo "The file $dir/$filename's permission is $perm "
      done
      
練習題
  1. 使用 while 語法,撰寫一 shell script,讓使用者輸入 yes 或者是 YES 才結束程式的執行,否則就一直進行告知使用者輸入字串。
    Sol.
    while [ "$yn" != "yes" ] && [ "$yn" != "YES" ]
    do
            read -p "Please input yes/YES to stop this program: " yn
    done
    

  2. 使用 until 語法,撰寫一 shell script,讓使用者輸入 yes 或者是 YES 才結束程式的執行,否則就一直進行告知使用者輸入字串。
    Sol.
    until [ "$yn" == "yes" ] || [ "$yn" == "YES" ]
    do
            read -p "Please input yes/YES to stop this program: " yn
    done
    

  3. 使用 while 語法,撰寫一 shell script,計算 1 累加到 100。
    Sol.
    s=0
    i=0
    while [ "$i" != "100" ]
    do
            i=$(($i+1))
            s=$(($s+$i))
    done
    echo "The result of '1+2+3+...+100' is ==> $s"
    

  4. 使用 for 語法,撰寫一 shell script,計算 1 累加到 100。
    Sol.
    s=0
    for (( i=1; i<=100; i=i+1 ))
    do
            s=$(($s+$i))
    done
    echo "The result of '1+2+3+...+100' is ==> $s"
    

  5. 使用 for 語法,撰寫一 shell script,輸出三種動物,dog, cat, elephant,且每一行都輸出:『There are dogs...』之類的字樣。
    Sol.
    for animal in dog cat elephant
    do
            echo "There are ""$animal""s...."
    done
    

  6. 使用 for 語法,撰寫一 shell script,讓使用者輸入某個目錄,然後找出該目錄內的所有檔名的權限。
    Sol.
    read -p "Please input a directory: " dir
    if [ "$dir" == "" ] || [ ! -d "$dir" ]; then
            echo "The $dir is NOT exist in your system."
            exit 1
    fi
    
    filelist=`ls $dir`
    for filename in $filelist
    do
            perm=""
            test -r "$dir/$filename" && perm="$perm readable"
            test -w "$dir/$filename" && perm="$perm writable"
            test -x "$dir/$filename" && perm="$perm executable"
            echo "The file $dir/$filename's permission is $perm "
    done
    



2017-06-14