13-3
條件敘述句
內容:
無論選擇性或重複性流程控制,大多需要條件判斷敘述,一般程式語言大多如此。在
Script
語言裡,條件敘述大多利用 test
命令,或一對中括號([
])包起來表示,有下列三種主要類型:
Ø
數值比較
Ø
字串比較(或測試)
Ø
測試檔案系統
以下分別介紹上述三種條件判斷敘述方法。
13-3-1
數值比較敘述
顧名思義,數值比較為兩個數值之間的比較結果,來作為條件判斷的依據。如果以變數表示的話,則判斷變數內存放數值(Shell
變數沒有指定變數型態,如 int、string
等等)。數值比較的格式如下:
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. |
|