判斷式:
判斷式,其判斷結果有「成立」與「不成立」兩種。可用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直接被印出來了),於是Linux將sss和fff看成兩個不同的參數!造成了非預期的結果!
正確的寫法,應用"$字串名稱"來取值,如:
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 判斷式三…:
只要有一個判斷式都成立,最終判斷結果就成立。
※ 判斷式的反值:!判斷式:
最終判斷結果之成立與否,乃是判斷式之成立與否的相反。
留言列表