13.真假值判斷

何者為真?何者為假? Bash shell 以其傳回值來決定,若傳回 0 則為真,傳回非0為假。

命令的傳回值會儲存一個特殊的變數裡:$?

例:[ 3 -gt 2 ]

echo $? 會傳回 0,因為 3 的確大於 2

例:[ 3 -gt 12 ]

echo $? 會傳回 1,因為 3 不大於 12

在此 [ ] 代表真假值判斷, [ 和 3 、 12 和 ] 之間必需要有空白; -gt 是 greater then 之意,即大於。

真假值的判斷有三大類:檔案測試、字串比較以及整數比較,以下列示之:

-a file
     若檔案存在則為真

-b file
     若檔案存在且是一個特殊的 block 檔則為真

-c file
     若檔案存在且是一個特殊的 character 檔則為真

-d file
     若若檔案存在且是一個目錄則為真

-e file
     若檔案存在則為真

-f file
     若檔案存在且是一個正規的檔案則為真

-g file
     若檔案存在且其 set-group-id 位元已設定則為真

-h file
     若檔案存在且是一個符號連結檔則為真

-k file
     若檔案存在且其 "sticky" 位元已設定則為真

-p file
     若檔案存在且是一個 named pipe (FIFO) 則為真

-r file
     若檔案存在且具有讀取的權限則為真

-s file
     若檔案存在且檔案大小大於 0 則為真

-t fd
     若檔案代碼 fd 已開啟且連接到一個終端機則為真

-u file
     若檔案存在且s set-user-id 位元已設定則為真

-w file
     若檔案存在且具有寫入的權限則為真

-x file
     若檔案存在且具有執行的權限則為真

-O file
     若檔案存在且被有效的使用者id所擁有則為真

-G file
     若檔案存在且被有效的群組id所擁有則為真

-L file
     若檔案存在且是一個符號連結檔則為真

-S file
     若檔案存在且是一個 socket 則為真

-N file
     若檔案存在且自它上次被讀取之後已被修改過了則為真

file1 -nt file2
     若 file1 比 file2 新則為真

file1 -ot file2
     若 file1 比 file2 舊則為真

file1 -ef file2
     若 file1 和 file2 有相同的設備和 inode 編號則為真

-o optname
     若 shell 的選項名稱 optname 已設定打開則為真

-z string
     若字串長度為 0 則為真

-n string
     若字串長度不是 0 則為真

string1 == string2
string1 = string2
     若字串 string1 和 string2 相同則為真

string1 != string2
     若字串 string1 和 string2 不相同則為真

string1 < string2
     若字串 string1 排序比 string2 小則為真

注意! 字串小於比較的正確寫法為 [ "$str1" \< "$str2" ]
因為 < 對 Bash 而言是輸入轉向之意,所以要放一個跳脫字元 \ 使其特殊意義消失 !

string1 > string2
     若字串 string1 排序比 string2 大則為真

注意! 字串大於比較的正確寫法為 [ "$str1" \> "$str2" ]
因為 > 對 Bash 而言是輸出轉向之意,所以要放一個跳脫字元 \ 使其特殊意義消失 !

arg1 -eq arg2
     若整數 arg1 等於 arg2 則為真

arg1 -ne arg2
     若整數 arg1 不等於 arg2 則為真

arg1 -lt arg2
     若整數 arg1 小於 arg2 則為真

arg1 -le arg2
     若整數 arg1 小於或等於 arg2 則為真

arg1 -gt arg2
     若整數 arg1 大於 arg2 則為真

arg1 -ge arg2
     若整數 arg1 大於或等於 arg2 則為真

若 要用 < > <= >= 來比較數字,則判斷式需擺在 ((   )) 中,如:

(( "982" > "24" ))

藉由邏輯運算,可結合好幾個真假值判斷:

[ -r filename1 -a -x filename ]
若 filename1 可讀且可執行則為真,-a 即 '且'之意。

[ -r filename1 -o -x filename ]
若 filename1 可讀 或 可執行 則為真,-o 即 '或'之意。

[ ! -r filename1 ] 
若 filename1 不是可讀 則為真,! 即 '非'之意。

常用的判斷技巧:

if [ "$var" = "" ]; then
     echo "$var 是空字串"
fi

以下效果相同:

if [ ! "$var" ]; then
     echo "$var 是空字串"
fi

if [ -z "$var" ]; then
     echo "$var 是空字串"
fi

if [ "X${var}" = "X" ]; then
     echo "$var 是空字串"
fi