next up previous contents
Next: if 條件判斷 Up: 流程控制與測試條件 Previous: 流程控制與測試條件   Contents

測試條件

在Bourne shell的內部命令裡面有測試條件的語法test給if while用
    test condition
    或者 
    [ condition ]
為了與autoconf不要混淆,programmer比較喜歡用test 不用中括號condition的方法。括號的用法請注意空格。 例如
    檔案測試條件
    test -f /etc/file      檔案是個一般檔案不是其他特殊檔案嗎
    [ -e file ]            檔案存在嗎
    [ -d /etc/ ]           目錄存在嗎
    [ -s file ]            檔案大小大於0嗎
    [ -r file ]            檔案可讀嗎

    字串測試條件
    [ "$string" ]          string有東西就返回true
    [ -n "$string" ]       string有東西(non-zero)返回true
    [ -z "$string" ]       string沒東西(zero)返回true
    [ "$s1"  = "$s2" ]     s1 等於 s2時返回true
    [ "$s1" != "$s2" ]     s1 不等於 s2時返回true

    數值條件  小心有多個-喔
    [ $num1 -eq $num2 ]    num1相等    num2 為true   
    [ $num1 -ne $num2 ]        不等    num2 為true
    [ $num1 -lt $num2 ]        小於    num2 為true
    [ $num1 -ge $num2 ]        大於等於num2 為true
    多重條件
    [ ! -f "testfile" -o ! -r "testfile" ]
    [ test condition -o test condition ]
    !               表示not
    -a		    表示and
    -o		    表示or
通常比較常用的又有portable的就是上面一些用法。 美觀上來說用中括號condition比較好看,很多人為了autoconf的語法portable起見, 盡量用test的寫法。測試的結果當然放在$?中,0表示成功, 其他值表示失敗。

在shell script中也有可能看到有人用
    if [ "x$VAR" = "xvalue" ]; then .....
來作$VAR是否是空的測試,尤其你如果先測試是否為空字串, 再測試是那個值要做什麼,這樣就會作兩次測試划不來,用這樣作比較經濟。

另外這跟perl字串與數值測試容易混淆,他跟perl剛好相反,而且perl沒有多-
    perl語法
    if ($str1 eq $str2)
    if ($num1 == $num2)
最後有個大比較,會一起列出shell perl c的差異來。(人老了記不住,我是這樣記 ,以perl為基準eq是字,所以前後是string,==是符號所以前後是number, bourne shell是怪胎,剛好顛倒,eq還要加個-符號。==要少一個=)
    C語法
    if (!strcmp(string1, string2))
    if (num1 == num2)



Cyril Huang 2002-06-14