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

13-4 選擇性敘述

內容:

一般 Shell script 大多提供有下列選擇性敘述:

Ø  if/then/elif/else/fi

Ø  case/esac

以下分別介紹之。

13-4-1 if 選擇結構

if 程式結構為最簡單且最常用的選擇性敘述,若是『條件』(Condition)成立的話,則執行某一程式區塊(一些敘述句的組合),但它也有幾種變形,以下分別介紹之。

A. if/then/fi 敘述】

Shell script 的程式區塊與一般程式語言之間有很大的不同。以 C 語言為例,程式區塊是利用大括號包括起來(如 {…..}),Shell script 並沒有使用到大括號的功能,然而 if 敘述是利用 then 語句表示程式區塊的開始,fi 表示程式區塊的結束。至於其他敘述(case/for/while 等等)亦大同小異,多半利用敘述句(如 case)的反向(如 esac)為程式區塊的結束。if 簡單格式如下:

if 條件判斷

then

    命令敘述區段

fi

上述 if 程式意思是條件成立的話,則執行 then fi 所涵蓋的程式區塊。基本上,Shell script 並不理會空白格與空白行的數量,也就是說,空一格或空兩格以上是沒有差別的,空一行與空多行亦同。但某些關鍵字(如 then if 等等)就必須獨立一行,如果需要與其它關鍵字結合成一行的話,必須使用分號(;)分隔。也就是說,分號(;)代表分行(或另開一行)的意思。下列是將 if 敘述重寫的格式:

if 條件判斷; then

    命令敘述區段

fi

更簡潔的格式如下:

if 條件判斷; then; 命令敘述區段; fi

B. 範例 ex7_13

此範例是測試某一檔案是否為一般檔案,並顯示其測試結果。$vi ex7_13

#!/bin/sh

 

if test -f $1

then

   echo "$1 is a reqular file"

fi

執行結果:

$ ex7_13 add.scr

add.scr is a reqular file

C. if/else 敘述】

if/else 敘述表示條件成立的話,執行 then 程式區塊,否則執行 else 程式區塊,格式如下:

if 條件判斷

then

    命令敘述區段

else

    命令敘述區段

fi

D. if/elif 敘述】

if/elif 敘述表示條件判斷不成立的話,再判斷其他條件(else if)是否成立,同樣的情況可以一直延伸下去,如此一來便可以整合多個條件判斷。每一次條件判斷的結果(成立或不成立),都可以建立它相對應的程式區塊,最後不管 if/elif 延伸多長,還是 fi 作為結束的語句。基本格式如下:

if 條件判斷

then

    命令敘述區段

    …….

elif 條件判斷

then

    命令敘述區段

    ……

…..

else

     命令敘述區段

     ……..

fi

E. 範例 ex7_14

此範例一樣測試某一檔案是否為一般檔案,但此程式先檢測是否有指定被測試檔案名稱,接著再測試是否為一般檔案,程式如下:($ vi ex7_14

#!/bin/sh

if test $# -ne 1  # 測試輸入格式是否正確

then

   echo "Usage:$0 test_file"

elif test -f $1

then

   echo "$1 is a regular file"

else

   echo "$1 is not regular file"

fi

13-4-2 case 選擇結構

case 敘述與 C 語言的 switch 很相似,都是依照某一變數的內容,再執行該內容的相對應程式區塊,但兩者之間還是有一些關鍵性的不同點。C 語言大多依照某一變數(或表示式)的數值當作判斷的依據,但 Shell script case 不僅可依照數值之外,也可依照『圖樣』(Pattern)作為判斷依據。圖樣可利用『正規式』(,如 *?[] 等等,第 4-6-2 節介紹)表現形形色色的結果,它的變化性會比數值多。基本格式如下:

case variable in

pattern_1) 命令敘述區塊 ;;

pattern_2)

statement 1;

statement 2;

statement 3;;

pattern_3) 命令敘述區塊 ;;

…..

esac

由上述中可以看出,由 case esac 關鍵字之間為 case 的敘述區塊,其中每一 pattern 程式區塊都是利用兩個分號(;;)做結束記號,而敘述之間則是以一個分號(;)分隔。

A. 範例 ex7_15

此範例以數值作為選擇的依照(如同 C 語言功能),其功能是將輸入數值轉換成英文數字。程式範例如下:$ vi ex7_15

#! /bin/bash

# file_name: ex7_15

if [ $# -ne 1 ]; then

  echo "Usage: $0 digital"

  exit 1

fi

case $1 in

  1) echo -n "One";

     echo "";;

  2) echo -n "Two  "; echo "";;

  3) echo -n "Three  "; echo "";;

  4) echo -n "Four  "; echo "";;

  5) echo -n "Five  "; echo "";;

  6) echo -n "Six  "; echo "";;

  7) echo -n "Seven  "; echo "";;

  8) echo -n "Eight  "; echo "";;

  9) echo -n "Nine  "; echo "";;

esac

執行結果如下:

$ ex7_15

Usage: ./ex7_15 digital

$ ex7_15 6

Six 

B. 範例 ex7_16

範例二是以正規式作為 case 判斷的依據,在正規式中的星號(*)代表零個或一個以上的任何字元。下述範例由判斷輸入姓名(FirtName_SecondName)中,尋找符合的『姓』(SecondName),並判斷該姓名為哪一家族的成員,程式範例如下:$vi ex7_16

#! /bin/bash

# file_name: ex7_16

echo "Test Nien, Lin, Chung, Lie, Chou or Wu family"

echo " "

if [ $# -lt 1 ]; then

  echo "Usage: $0 FirstName_SecondName"

  exit 1

fi

case $1 in

  *Nien) echo "Your Nien family";;

  *Lin) echo "Your Lin family";;

  *Chung) echo "Your Chung family";;

  *Lie) echo "Your Lie family";;

  *Chou) echo "Your Chou family";;

  *Wu) echo "Your Wu family";;

  *) echo "Not test family";;

esac

我們執行該程式,以 TienShou_Nien 為引數。Case 比對 *Nien,執行結果如下:

$ ex7_16 TienShou_Nien

Test Nien, Lin, Chung, Lie, Chou or Wu family

 

Your Nien family

$ ex7_16 ShunJie_Wu

Test Nien, Lin, Chung, Lie, Chou or Wu family

 

Your Wu family

 

 

翻轉工作室:粘添壽

 

Linux 伺服器系統管理 - CentOS:

 

 

 

翻轉電子書系列: