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

13-3 條件敘述句

內容:

無論選擇性或重複性流程控制,大多需要條件判斷敘述,一般程式語言大多如此。在 Script 語言裡,條件敘述大多利用 test 命令,或一對中括號([ ])包起來表示,有下列三種主要類型:

Ø  數值比較

Ø  字串比較(或測試)

Ø  測試檔案系統

以下分別介紹上述三種條件判斷敘述方法。

13-3-1 數值比較敘述

顧名思義,數值比較為兩個數值之間的比較結果,來作為條件判斷的依據。如果以變數表示的話,則判斷變數內存放數值(Shell 變數沒有指定變數型態,如 intstring 等等)。數值比較的格式如下:

  test $integer1 –eq $integer2

其中 –eq 表示『相等』的比較旗號。比較的結果會傳回『真』(1)或『假』(0),test 運算子如表13-1

13-1 數值比較的運算子

比較旗號

                     

-eq

等於(=,若兩數相等則傳回 真(1,否則為 0

-ne

不定於(!=

-lt

小於(<

-le

小於或等於(<=

-gt

大於(>

-ge

大於或等於(>=

我們用一個簡單範例來驗證 test 命令語句的使用方法。下列程式為輸入兩個數值之後,再判斷兩數是否相同,並輸出其結果,程式範例如下:$vi ex7_8

#! /bin/bash

# file_name: ex7_8

echo -n "Enter first number =>"

read n1

echo -n "Enter second number =>"

read n2

if test $n1 -eq $n2

  then

       echo "Two numbers are eqaul"

  else

       echo "Not equal"

fi

執行結果如下:

$ ex7_8

Enter first number =>500

Enter second number =>500

Two numbers are eqaul

一般 Shell script 還提供另一種不需要 test 的語法,而用中括號包括起來的方法。值得注意的是,左括號的右邊與右括號的左邊都必須留空格,否則系統會將中括號當作變數名稱的一部分,程式範例如下:$vi ex7_9

#! /bin/bash

# file_name: equal_scr

echo -n "Enter first number =>"

read n1

echo -n "Enter second number =>"

read n2

if [ $n1 -eq $n2 ]     #[ 之後 ] 之前需空格

  then

       echo "Two numbers are eqaul"

  else

       echo "Not equal"

fi

讀者可以自行練習看看,執行的結果應該與上個範例相同。

13-3-2 字串比較敘述

字串比較就是比較兩個字串作為判斷條件的依據,只是比較字串與比較數值之間有很大的不同,一般比較字串也有比較字串是否相等、或字串是否為空字串、以及利用 ASCII 碼比較兩字串的大小,如表 13-2 所示。

13-2 字串比較的運算子

比較運算子

     

=

比較兩字串是否相符合,如 str1 = str2

!=

不符合(即是兩字串內容不相同),如 str1 != str2

小於(依 ASCII 碼比較大小),如 str1 < str2

大於(依 ASCII 碼比較大小),如 str1 > str2

-n

不是空字串(字串長度大於 0),如 –n str1

-z

空字串(字串長度為 0),如 –z str1

接下來,我們用 string_scr 程式範例來驗證字串比較,程式中希望輸入 Good 字串,再比較是否輸入正確。這裡可看到採用變數與字串之間的比較關係,範例如下:$vi ex7_10

#! /bin/bash

# file_name: string_scr

echo "Test string is: Good"

echo -n "Please enter test string =>"

read n1

if [ “$n1” = "Good" ]     #[ 之後 ] 之前需空格

  then

       echo "Corrected input"

  else

       echo "Not correct input"

fi

執行結果如下:

$ ex7_10

Test string is: Good

Please enter test string =>Good

Corrected input

$ ex7_10

Test string is: Good

Please enter test string =>lucky

Not correct input

13-3-3 檔案屬性測試敘述

另一個重要的條件判斷,即是檔案屬性的檢查,這在管理系統上非常有幫助,基本命令格式如下:

test –d file_1

其中 –d 為測試選項之一,如果 file_1 是目錄的話,則傳回『真』。表 13-3 是所有能測試的屬性。

13-3 檔案測試選項

   

                   

-l

該檔案是否屬於鏈結檔案,如是則傳回『真』。

-d

如果是目錄則傳回真。

-e

如果檔案存在則傳回真。

-f

如果檔案存在並且是一般檔案則傳回真。

-g

如果檔案存在並且是特定群組可執行的,則傳回真。

-r

如果檔案存在並且可讀的,則傳回真。

-s

如果檔案存在且存有資料,則傳回真。

-w

如果檔案存在且可寫入資料,則傳回真。

-x

如果檔案存在且可執行,則傳回真。

-nt

比較兩檔案是否較新(修改時間),如 file1 –nt file2

-ot

比較兩檔是否較舊,如 file1 –ot file2

我們再利用一個範例來說明檔案測試的功能,ex7_11 程式可測試所輸入的程式是目錄或一般檔案,以及使用者對該檔案的權限如何,程式範例如下:$vi ex7_11

#! /bin/bash

# file_name: test_file

if [ ! -e $1 ]; then

  echo "file $1 does not exist."

  exit 1

fi

if [ -d $1 ]; then

  echo -n "$1 is a directory that you may "

  if [ ! -x $1 ]; then

     echo -n "not "

  fi

  echo "search."

  elif [ -f $1 ]; then

     echo "$1 is a reqular file."

  else

     echo "$1 is a special file."

fi

if [ -O $1 ]; then

  echo "you own the file"

else

  echo "you do not own the file"

fi

if [ -r $1 ]; then

  echo "you have read permission on the file"

fi

if [ -w $1 ]; then

  echo "you have write permission on the file"

fi

if [ -x $1 ]; then

  echo "you have execute permission on the file"

fi

上述範例中可以發現 if/then 編寫格式有稍微改變一些,標準 then 語句是另開始一行,如果與 if 同一行的話,則需利用分號(;)隔開。也就是說,在 Shell script 程式設計中,分號(;)表示另開始一行的意思;讀者可自行測試看看,是否屬實。其執行結果如下:(假設目錄底下有 set_scr 檔案,並測試該檔案的屬性如何)

$ ex7_11 set_scr

set_scr is a reqular file.

you own the file

you have read permission on the file

you have write permission on the file

you have execute permission on the file

$

13-3-4 條件組合敘述

一般程式語言大多可以利用『且』(and&&)與『或』(or||)兩個邏輯運算子,來整合多個條件組合。其中 && 表示兩個條件都成立則為『真』(True);|| 表示兩條件中任一條件成立則為『真』。Shell script 也不例外,同樣有這兩個運算子,程式範例如下:$vi ex7_12

#! /bin/bash

# file_name: or_scr

#if (test -r $1) && (test -x $1)

if [ -r $1 ] && [ -x $1 ]; then

  echo "You have read/write to $1 Permission."

else

  echo "You donot permission for $1."

fi

執行結果如下:(假設 args 檔案存在並測試它)

$ ex7_12 args

You have read/write to args Permission.

 

翻轉工作室:粘添壽

 

Linux 伺服器系統管理 - CentOS:

 

 

 

翻轉電子書系列: