test 檔案運算子

it_newbalance發表於2013-01-18

test 檔案運算子

利用這些運算子,您可以在程式中根據對檔案型別的評估結果執行不同的操作:test 檔案運算子利用這些運算子,您

-b file 如果檔案為一個塊特殊檔案,則為真

-c file 如果檔案為一個字元特殊檔案,則為真不同的操作: -b file 如果檔案為

-d file 如果檔案為一個目錄,則為真

-e file 如果檔案存在,則為真

-f file 如果檔案為一個普通檔案,則為真一個塊特殊檔案,則為真 -c file

-g file 如果設定了檔案的 SGID 位,則為真

-G file 如果檔案存在且歸該組所有,則為真

-k file 如果設定了檔案的粘著位,則為真test 檔案運算子利用這些運算子,您

-O file 如果檔案存在並且歸該使用者所有,則為真

-p file 如果檔案為一個命名管道,則為真

-r file 如果檔案可讀,則為真不同的操作: -b file 如果檔案為

-s file 如果檔案的長度不為零,則為真

-S file 如果檔案為一個套接字特殊檔案,則為真

-t fd 如果 fd 是一個與終端相連的開啟的檔案描述符(fd 預設為 1),則為真可以在程式中根據對檔案型別的評估結果執行

-u file 如果設定了檔案的 SUID 位,則為真

-w file 如果檔案可寫,則為真

-x file 如果檔案可執行,則為真一個塊特殊檔案,則為真 -c file

以下示例顯示了此簡單操作的執行情況:

test 檔案運算子利用這些運算子,您$ ls -l

total 33

drwxr-xr-w 2 root root 1024 Dec 5 05:05 LST一個塊特殊檔案,則為真 -c file

-rw-rw-rw- 1 emmett users 27360 Feb 6 07:30 evan

-rwsrwsrwx 1 root root 152 Feb 6 07:32 hannah

drwxr-xr-x 2 emmett users 1024 Feb 6 07:31 karentest 檔案運算子利用這些運算子,您

-rw------- 1 emmett users 152 Feb 6 07:29 kristin

-rw-r--r-- 1 emmett users 152 Feb 6 07:29 spencer

$test 檔案運算子利用這些運算子,您

$ test -r evan

$ echo $?一個塊特殊檔案,則為真 -c file

0

$ test -r walter一個塊特殊檔案,則為真 -c file

$ echo $?

1

$不同的操作: -b file 如果檔案為

由於第一次評估為真 — 檔案存在且可讀 — 返回值為真,或 0。由於第二次評估的檔案不存在,該值為假,返回值不為零。將值指定為零或非零很重要,因為在失敗時不會始終返回 1(雖然這是通常返回的值),可能返回一個非零值。

不同的操作: -b file 如果檔案為正如開頭所提到的,除了使用 test 外,您還可以用方括號 [ ] 將命令括住來向 shell 發出同樣的命令 — 如下所示:

$ [ -w evan ]如果檔案為一個字元特殊檔案,則為真 -d

$ echo $?

0

$ [ -x evan ]test 檔案運算子利用這些運算子,您

$ echo $?

1

$可以在程式中根據對檔案型別的評估結果執行

同樣,第一個表示式為真,第二個表示式為假 — 正如返回值所指示的那樣。您還可以使用以下命令將兩個檔案彼此進行比較:

可以在程式中根據對檔案型別的評估結果執行file1 -ef file2 測試以判斷兩個檔案是否與同一個裝置相連,是否擁有相同的 inode 編號

file1 -nt file2 測試以判斷第一個檔案是否比第二個檔案更新(由修改日期決定)

file1 -ot file2 測試以判斷第一個檔案是否比第二個檔案更舊test 檔案運算子利用這些運算子,您

以下示例顯示了使用這些運算子比較檔案的結果:

test 檔案運算子利用這些運算子,您$ [ evan -nt spencer ]

$ echo $?

0一個塊特殊檔案,則為真 -c file

$ [ karen -ot spencer ]

$ echo $?

1一個塊特殊檔案,則為真 -c file

$

名為 evan 的檔案比名為 spencer 的檔案更新,因而評估為真。類似地,名為 karen 的檔案比名為 spencer 的檔案更新,因此該評估為假。test 檔案運算子利用這些運算子,您

字串比較運算子

一個塊特殊檔案,則為真 -c file 如標題所示,這組函式比較字串的值。您可以檢查它們是否存在、是否相同或者是否不同。

String 測試以判斷字串是否不為空不同的操作: -b file 如果檔案為

-n string 測試以判斷字串是否不為空;字串必須為 test 所識別

-z string 測試以判斷字串是否為空;字串必須為 test 所識別

string1 = string2 測試以判斷 string1 是否與 string2 相同不同的操作: -b file 如果檔案為

string1 != string2 測試以判斷 string1 是否與 string2 不同

對任何變數進行的最有用的測試之一是判斷它的值是否不為空,可以簡單地將其放在 test 命令列中執行這種測試,如下例所示:test 檔案運算子利用這些運算子,您

$ test "$variable"

不同的操作: -b file 如果檔案為強烈建議進行此種測試時用雙引號將變數括住,以讓 shell 識別變數(即使變數為空)。預設情況下執行的基本字串評估和 -n 測試從功能上講是相同的,如以下示例所示:

#example1

if test -n "$1"test 檔案運算子利用這些運算子,您

then

echo "$1"

fi不同的操作: -b file 如果檔案為

執行以上例子中的程式碼將根據 $1 是否存在給出以下結果:

test 檔案運算子利用這些運算子,您$ example1 friday

friday

$不同的操作: -b file 如果檔案為

$ example1

$

如果檔案為一個字元特殊檔案,則為真 -d如果將程式碼更改為以下形式,則結果將相同:

#example2一個塊特殊檔案,則為真 -c file

if test "$1"

then

echo "$1"不同的操作: -b file 如果檔案為

fi

如下所示:可以在程式中根據對檔案型別的評估結果執行

$ example2 friday

friday可以在程式中根據對檔案型別的評估結果執行

$

$ example2

$如果檔案為一個字元特殊檔案,則為真 -d

所有這些表明,通常不需要 -n,它代表預設操作。

不同的操作: -b file 如果檔案為要從一個不同的角度來檢視各種可能性,您可以用另一個選項來替換 -n,並檢查該值是否為空(相對於非空)。這可以用 -z 選項來實現,程式碼為:

#example3test 檔案運算子利用這些運算子,您

if test -z "$1"

then

echo "no values were specified"不同的操作: -b file 如果檔案為

fi

執行如下:不同的操作: -b file 如果檔案為

$ example3

no values were specified如果檔案為一個字元特殊檔案,則為真 -d

$ example3 friday

$

如果檔案為一個字元特殊檔案,則為真 -d如果在沒有命令列引數的情況下執行該程式,而表示式評估為真,那麼將執行程式塊中的文字。如果在命令列中有值,則指令碼退出,不執行任何操作。將評估操作放在指令碼的開頭非常有用,這可以在可能產生錯誤的進一步處理之前預先檢查變數值。

其餘的字串運算子對兩個變數/字串之間的精確匹配或其中的差異(您也可以稱之為等價性和“不等價性”)進行評估。第一個例子對匹配進行測試:不同的操作: -b file 如果檔案為

$ env

LOGNAME=emmett不同的操作: -b file 如果檔案為

PAGER=less

SHELL=/bin/bash

TERM=linux一個塊特殊檔案,則為真 -c file

$

$ [ "$LOGNAME" = "emmett" ]

$ echo $?可以在程式中根據對檔案型別的評估結果執行

0

$

$ [ "$LOGNAME" = "kristin" ]不同的操作: -b file 如果檔案為

$ echo $?

1

$test 檔案運算子利用這些運算子,您

或者,該評估可以以指令碼的形式用於決定是否執行指令碼:

如果檔案為一個字元特殊檔案,則為真 -d#example4

if [ "$LOGNAME" = "emmett" ]

then如果檔案為一個字元特殊檔案,則為真 -d

echo "processing beginning"

else

echo "incorrect user"test 檔案運算子利用這些運算子,您

fi

這種方法可以用來尋找任意的值(如終端型別或 shell 型別),在允許指令碼執行之前這些值必須匹配。請注意,= 或 != 運算子的優先順序高於其它大多數可指定選項,且要求必須伴有表示式。因此,除了比較字串的選項之外,= 或 != 都不能和檢查某種東西(如可讀檔案、可執行檔案或目錄)的存在性的選項一起使用。

相關文章