Linux 伺服器系統管理第十三章 Shell Script 程式設計  上一頁    下一頁

13-5 重複性敘述

內容:

所謂重複性程式結構大多指迴圈敘述,Shell script 的迴圈敘述有 forwhileuntil select 等四種類型,其中 while until 敘述與 C 語言比較類似,但 for select 幾乎與 C 語言的 for 迴圈完全不同,以下分別介紹之。

13-5-1 for 迴圈結構

一般程式語言的 for 迴圈大多有一個計數器(counter),計算迴圈內執行的次數。然而 Shell script for 迴圈則完全不同,它是依照某一序列內的元件數量,再依據每一個元件的數值執行迴圈一次,元件的數量就代表迴圈的執行次數。for 迴圈的基本結構如下:

for var in List

do

     commands

     commands

done

其中,List 表示一連串的數值(或序列),變數 var 連續取代執行 List 串列中的數值(或其他格式的內容),每取代一個數值則執行迴圈一次,至於程式的實體則包含在關鍵字do done之間。

A. 範例ex7_17

此範例是列出目前目錄底下的一般檔案名稱,程式範例如下:$vi ex7_17

#! /bin/bash

# file_name: ex7_17

for var in `ls`

do

  if [ -f $var ]; then

     echo "$var is a reqular file."

  fi

done

for var in `ls` 敘述中,ls 是利用兩個『反向單引號』(`)包起來,表示執行 ls 命令的意思;整個敘述的功能是執行 ls 命令後產生一個串列的結果,而變數 var 取用串列中元件,每取一個元件則執行 do done 之間的程式區塊一次。執行結果如下:

$ ex7_17

and_scr is a reqular file.

args is a reqular file.

……

13-5-2 select 迴圈結構

select 敘述不但具有迴圈的功能,也具有選擇性功能,運作情況與 for 迴圈有點相同。我們先觀察程式結構,再來探討其功能為何,其程式結構如下:

select var in List

do

commands

commands

…….

done

select 程式結構與 for 非常相似,但兩者之間的運作還是有很大的差異。相同的 List 表示一串列的元件,但 select 敘述被執行時,系統會將這一串列元件當作選項,並以環境變數 PS3 作為選項輸入的提示。當使用者在 PS3 提示下輸入某一選項時,選項的元件即被存入 var 變數內,並且執行 do done 之間的程式區塊;執行完畢以後,再回到選項提示下,所以select不但具有選擇性功能,也具有迴圈性的功能。

A. 範例 ex7_18

本範例功能是選擇測試目錄下檔案是否為一般檔案,程式範例如下:$vi ex7_18

#! /bin/bash

# file_name: ex7_18

PS3="Selection =>"

select var in `ls`

do

  if [ $var ]; then

      if [ -f $var ]; then

          echo "$var is a reqular file."

      else

          echo "$var not a reqular file."

      fi

  else

      echo "Bad input"

  fi

done

程式一開始即設定環境變數 PS3Selection =>),再利用 ls 顯示目前目錄下所有檔案。當使用者選擇一選項後,立即進入 do done 之間的程式區塊,其執行結果如下:

$ ex7_18

1) args        3) dir_2       5) file_2

2) dir_1       4) file_1      6) select_scr

Selection =>1

args is a reqular file.

Selection =>3

dir_2 not a reqular file.

Selection =>                          Ctrl+D 結束】

$

13-5-3 while 迴圈結構

Shell script while 迴圈功能幾乎與 C 語言的 while 相同,唯一差別在於條件判斷的格式。 while 敘述在條件成立時,會執行 do done 之間的程式區塊,執行完後再回來測試條件判斷,如條件再成立就必須再執行程式區塊,如此反覆,直到條件不成立再跳出迴圈。基本格式如下:

while 條件判斷

do

     命令區塊

done

A. 範例 ex7_19

此範例是以 1 加到 100 來驗證 Shell script while 敘述功能,程式範例如下:$ vi ex7_19

#! /bin/bash

# print 1+2+3, ...+100

count=1

sum=0

while [ $count -le 100 ]; do

   sum=`expr $sum + $count`

   count=`expr $count + 1`

done

echo "1+2+3+, ...+100 = $sum"

執行結果如下:

$ ex7_19

1+2+3+, ...+100 = 5050

13-5-4 until 迴圈結構

until 敘述正好與 while 迴圈相反,也就是說,當條件不成立時,會執行迴圈區塊,直到條件成立才跳出迴圈。其命令格式如下:

until 條件判斷

do

     命令區塊

done

A. 範例 ex7_20

此範例是當使用者輸入任何文字,程式會回應相同文字,直到出現quit 字元為止,程式如下:$vi ex7_20

#! /bin/bash

# echo input character until "quit"

echo -n "Input your character (quit) =>"

read string1

until test $string1 = "quit"; do

    echo "Your input is $string1"

    echo -n "Input again (quit) =>"

    read string1

done

echo "You’re Welcome"

執行結果如下:

$ ex7_20

Input your character (quit) =>Good

Your input is Good

Input again (quit) =>luck

Your input is luck

Input again (quit) =>quit

You’re Welcome

13-5-5 break continue 命令

一般程式語言的 forwhile until 迴圈,大多會利用 break continue 敘述來中斷或延續迴圈的執行。同樣的,Shell script 迴圈也擁有這兩個命令的功能,如果是巢狀迴圈的話,也可在 break continue 敘述後增加一個數字引數(如 break 2 continue 2),指定中斷或延續第幾個迴圈。

 

翻轉工作室:粘添壽

 

Linux 伺服器系統管理 - CentOS:

 

 

 

翻轉電子書系列: