2007年10月11日 星期四

檢查檔案型態或比對數值(運用說明)

譬如,我要 script 偵測某目錄,如果不存在便自動建立該目錄。當我想要這樣做時,我第一個想到的是使用 -d 來做偵測,但她是以目錄"存在"為真值,所以剛好和我需要的相反。像這種情況,我就可以藉助邏輯符號 "!" 來做到 -d 的反向邏輯。

[Farmer_Akira@www]# cat test-nd
#!/bin/bash

if [ ! -d /home/system-patch ]
then
mkdir /home/system-patch
fi

===========================================
[Farmer_Akira@www]# cat test-steq
#!/bin/bash

ST1=$1
ST2=$2

if [ -z "$1" ] #測試 arg1 是否為"空字串"
then
echo "No command-line argument 1."
exit 1
fi

if [ -z "$2" ] #測試 arg2 是否為"空字串"
then
echo "No command-line argument 2."
exit 1
fi

if [ "$ST1" = "$ST2" ] #測試 arg1 內容是否等於 arg2
then
echo "$ST1 is equal to $ST2"
else
echo "$ST1 is no equal to $ST2"
fi

exit 0


test-steq 做的事情只是簡單地比對 script 的 arg1 與 arg2 是否相等。因為使用時有可能會忘記輸入 arg1 或 arg2,所以我加上 arg1 與 arg2 是否為"空字串"的偵測。當她們是空字串時,會顯示訊息然後以狀態值 1 結束 script 的執行。這是一個正邏輯的例子。


==============================================
對數字的偵測與比較

數字偵測、比較
-eq 等於
-gt 大於
-ge 大於等於
-ne 不等於
-lt 小於
-le 小於等於
test 在數字方面的支援是比較兩個數字是否相等(-eq)、不相等(-ne)、大於(-gt)、大於等於(-ge)、小於(-lt)、小於等於(-le)。這也就是右表所描述的功能。和先前一樣,條件成立回應"真",不成立回應"偽"。

實際運用有兩種型式,其一就是使用先前的功能代碼,其二則是在 (...) 內使用符號(==, >, >=, <, <=)。兩者的語法有些許差異的。我個人習慣使用前者。

這兩者使用時都需留意帶入的數字是否是--"整數"。因為帶入"非整數"會出現錯誤訊息,還會得固定得到"偽"的判斷值。讓我們還看以下簡單的例子

[Farmer_Akira@www]# cat test-number01
#!/bin/bash
a=30

if [ $1 -lt $a ]
then
echo "$1 is less than $a"
else
echo "$1 is greater than $a"
fi

if (( $1 < $a ))
then
echo "$1 is less than $a"
else
echo "$1 is greater than $a"
fi


[Farmer_Akira@www]# ./test-number01 10
10 is less than 30
10 is less than 30
[Farmer_Akira@www]# ./test-number01 40
40 is greater than 30
40 is greater than 30
[Farmer_Akira@www]# ./test-number01 10.1
test-number01: [: 10.1: integer expression expected
10.1 is greater than 30
test-number01: ((: 10.1 < 30 : syntax error in expression (error token is ".1 < 30 ")
10.1 is greater than 30


上例的最後我刻意帶入非整數值,果然得到免費的錯誤訊息以及發瘋的執行結果 -- 10.1 is greater than 30。所以 -- 不支援"非整數",小心 HAL 抓狂。

沒有留言: