close

前往shell script教學目錄

 

判斷式:

判斷式,其判斷結果有「成立」與「不成立」兩種。可用test關鍵字來測試判斷式成立與否。這行命令:test 判斷式和其他的命令一樣,執行後會回傳錯誤碼。※ 若判斷式成立,則錯誤碼為0,我們稱「測試結果為真」。

※ 若判斷式不成立,則錯誤碼為一個大於0的整數,我們稱「測試結果為假」。

判斷式的語法形式依據所要判斷的對象而不同。判斷式的語法形式如下:

 (1) 所要判斷的對象是「路徑上的檔案」:

-e 路徑 :測試該路徑上是否已存在?若有則判斷式成立。

-f 路徑 :測試該路徑上是否已存在且其類型為檔案?若是則判斷式成立。

-d 路徑 :測試該路徑上是否已存在且其類型為目錄(資料夾)?若是則判斷式成立。

-b 路徑 :測試該路徑上是否已存在且其類型為block device 裝置?若是則判斷式成立。

-c 路徑 :測試該路徑上是否已存在且其類型為character device 裝置?若是則判斷式成立。

-S 路徑 :測試該路徑上是否已存在且其類型為Socket檔案?若是則判斷式成立。

-p 路徑 :測試該路徑上是否已存在且其類型為FIFO(pipe)檔案?若是則判斷式成立。

-L 路徑 :測試該路徑上是否已存在且其類型為連結檔?若是則判斷式成立。

 

(2) 所要判斷的對象是路徑上檔案或目錄的權限或屬性

-r 路徑 :測試該路徑上者,其是否具有可讀權限?若是則判斷式成立。

-w 路徑 :測試該路徑上者,其是否具有可寫權限?若是則判斷式成立。

-x 路徑 :測試該路徑上者,其是否具有可執行權限?若是則判斷式成立。

-u 路徑 :測試該路徑上者,其是否具有SUID屬性?若是則判斷式成立。

-g 路徑 :測試該路徑上者,其是否具有SGID屬性?若是則判斷式成立。

-k 路徑 :測試該路徑上者,其是否具有Sticky bit屬性?若是則判斷式成立。

-s 路徑 :測試該路徑上者,其大小是否不為零?若不為零則判斷式成立。

 

(3) 所要判斷的對象是路徑上檔案或資料夾之間的比較

路徑一 -nt 路徑二 :測試路徑一上的檔案(或資料夾)是否比路徑二上的檔案(或資料夾)還要新,若是則判斷式成立。

路徑一 -ot 路徑二 :測試路徑一上的檔案(或資料夾)是否比路徑二上的檔案(或資料夾)還要舊,若是則判斷式成立。

路徑一 -ef 路徑二 :測試路徑一上的檔案(或資料夾)是否和路徑二上的檔案(或資料夾)指向同一個inode,若是則判斷式成立。

 

(4) 所要判斷的對象是整數之間的比較

$整數一 -eq $整數二:測試兩整數是否相等,若是則判斷式成立。

$整數一 -ne $整數二:測試兩整數是否不相等,若是則判斷式成立。

$整數一 -gt $整數二:測試整數一是否大於整數二,若是則判斷式成立。

$整數一 -lt $整數二:測試整數一是否小於整數二,若是則判斷式成立。

$整數一 -ge $整數二:測試整數一是否大於等於整數二,若是則判斷式成立。

$整數一 -le $整數二:測試整數一是否小於等於整數二,若是則判斷式成立。

 

(5) 所要判斷的對象是字串的比較與判定

–z $字串:測試字串是否為空字串,若是則判斷式成立。

–n $字串:測試字串是否為非空字串,若是則判斷式成立。

$字串一=$字串二:測試字串一是否等於字串二,若是則判斷式成立。

$字串一!== $字串二:測試字串一是否不等於字串二,若是則判斷式成立。

(重要!):在取字串的值時,若是用$字串名稱來取值,字串內容會直接被印出來。如:

s1="sss   fff"

test $s1 == "sss   fff" && echo "Y" || echo "N" #關於&&||的用法,在(6)有說明

執行結果顯示:

出現了錯誤訊息,說test命令有太多參數。事實上,第二行的寫法等同於test sss fff == "sss   fff" && echo "Y" || echo "N"(因為字串s1直接被印出來了),於是Linuxsssfff看成兩個不同的參數!造成了非預期的結果!

正確的寫法,應用"$字串名稱"來取值,如:

s1="sss   fff"

test "$s1" == "sss   fff" && echo "Y" || echo "N"   #$s1改成了"$s1"

執行結果顯示:

,這即是預期中的結果。

結論:在對字串取值的時候,以"$字串名稱"的用法為佳。

 

(6) test測試結果的真假,可以決定要執行的命令。寫法為:

test判斷式 && 測試結果為真時要執行的命令 || 測試結果為假時要執行的命令

如:

n1=100

n2=15

test $n1 -gt $n2 && echo "n1 is greater" || echo "n2 is greater"

執行顯示:

 

(7) 利用test測試多重判斷式(判斷式串)

判斷式的交集:判斷式一 –a 判斷式二 –a 判斷式三

只有當所有判斷式都成立,最終判斷結果才成立。如:

s1="dkkk"

s2="kkk"

test "$s1" == "dkkk" -a "$s2" == "kkk" && echo "Y" || echo "N" 

執行顯示:

 

判斷式的聯集:判斷式一 –o 判斷式二 –o 判斷式三

只要有一個判斷式都成立,最終判斷結果就成立。

判斷式的反值:!判斷式

最終判斷結果之成立與否,乃是判斷式之成立與否的相反。

 

 

上一篇:變數的宣告

下一篇:if case的用法

前往shell script教學目錄

arrow
arrow
    創作者介紹
    創作者 埃伯 的頭像
    埃伯

    程式語言教學

    埃伯 發表在 痞客邦 留言(0) 人氣()