SHELL test [ 命令用法
From: http://blog.csdn.net/ubuntulover/article/details/6978305
?
原文地址:http://www.examw.com/linux/all/114976/index.htmltest命令用法。功能:檢查文件和比較值
1)判斷表達式
if test? (表達式為真)
if test !表達式為假
test 表達式1 –a 表達式2????????????????? 兩個表達式都為真
test 表達式1 –o 表達式2???????????????? 兩個表達式有一個為真
2)判斷字符串
test –n 字符串?????????????????????????????????? 字符串的長度非零
test –z 字符串??????????????????????????????????? 字符串的長度為零
test 字符串1=字符串2??????????????????? 字符串相等
test 字符串1!=字符串2?????????????? 字符串不等
3)判斷整數
test 整數1 –eq 整數2??????????????????????? 整數相等
test 整數1 –ge 整數2??????????????????????? 整數1大于等于整數2
test 整數1 –gt 整數2???????????????????????? 整數1大于整數2
test 整數1 –le 整數2???????????????????????? 整數1小于等于整數2
test 整數1 –lt 整數2????????????????????????? 整數1小于整數2
test 整數1 –ne 整數2??????????????????????? 整數1不等于整數2
4)判斷文件
test? File1 –ef? File2 兩個文件具有同樣的設備號和i結點號
test? File1 –nt? File2 文件1比文件2 新
test? File1 –ot? File2 文件1比文件2 舊
test –b File 文件存在并且是塊設備文件
test –c File 文件存在并且是字符設備文件
test –d File 文件存在并且是目錄
test –e File 文件存在
test –f File? 文件存在并且是正規文件
test –g File 文件存在并且是設置了組ID
test –G File 文件存在并且屬于有效組ID
test –h File 文件存在并且是一個符號鏈接(同-L)
test –k File 文件存在并且設置了sticky位
test –b File 文件存在并且是塊設備文件
test –L File 文件存在并且是一個符號鏈接(同-h)
test –o File 文件存在并且屬于有效用戶ID
test –p File 文件存在并且是一個命名管道
test –r File 文件存在并且可讀
test –s File 文件存在并且是一個套接字
test –t FD 文件描述符是在一個終端打開的
test –u File 文件存在并且設置了它的set-user-id位
test –w File 文件存在并且可寫
test –x File 文件存在并且可執行
每一種條件語句的基礎都是判斷什么是真什么是假。是否了解其工作原理將決定您編寫的是質量一般的腳本還是您將引以為榮的腳本。
Shell 腳本的能力時常被低估,但實際上其能力的發揮受制于腳本撰寫者的能力。您了解得越多,您就越能像變戲法似地撰寫一個文件來使任務自動化和簡化您的管理工作。
在 shell 腳本中進行的每一種操作(除最簡單的命令編組之外)都需要檢查條件。所有的 shell 腳本“邏輯” — 廣義意義下的“邏輯” — 通常都可以分為以下三大類:if {condition exists} then ...
while {condition exists} do ...
until {condition exists} do ...
無論隨后的操作是什么,這些基于邏輯的命令都依靠判斷一種條件是否真實存在來決定后續的操作。test 命令是使得在每一種情況下都能夠確定要判斷的條件是否存在的實用工具。因此,徹底了解這個命令對于撰寫成功的 shell 腳本至關重要。
工作原理
test 命令最短的定義可能是評估一個表達式;如果條件為真,則返回一個 0 值。如果表達式不為真,則返回一個大于 0 的值 — 也可以將其稱為假值。檢查最后所執行命令的狀態的最簡便方法是使用 $? 值。出于演示的目的,本文中的例子全部使用了這個參數。
test 命令期望在命令行中找到一個參數,當 shell 沒有為變量賦值時,則將該變量視為空。這意味著在處理腳本時,一旦腳本尋找的參數不存在,則 test 將報告該錯誤。
當試圖保護腳本時,您可以通過將所有參數包含在雙引號中來解決這個問題。然后 shell 將變量展開,如果變量沒有值,那么將傳遞一個空值給 test。另一種方法是在腳本內增加一個額外檢查過程來判斷是否設置了命令行參數。如果沒有設置命令行參數,那么腳本會告訴用戶缺少參數,然后退出。我們 會通過一些例子來更具體地說明所有這些內容。
test 和 [ 命令
雖然 Linux 和 UNIX 的每個版本中都包含 test 命令,但該命令有一個更常用的別名 — 左方括號:[。test 及其別名通常都可以在 /usr/bin 或 /bin (取決于操作系統版本和供應商)中找到。
當您使用左方括號而非 test 時,其后必須始終跟著一個空格、要評估的條件、一個空格和右方括號。右方括號不是任何東西的別名,而是表示所需評估參數的結束。條件兩邊的空格是必需的,這表示要調用 test,以區別于同樣經常使用方括號的字符/模式匹配操作。
test 和 [ 的語法如下:
test expression
[ expression ]
在這兩種情況下,test 都評估一個表達式,然后返回真或假。如果它和 if、while 或 until 命令結合使用,則您可以對程序流進行廣泛的控制。不過,您無需將 test 命令與任何其它結構一起使用;您可以從命令行直接運行它來檢查幾乎任何東西的狀態。
因為它們彼此互為別名,所以使用 test 或 [ 均需要一個表達式。表達式一般是文本、數字或文件和目錄屬性的比較,并且可以包含變量、常量和運算符。運算符可以是字符串運算符、整數運算符、文件運算符或布爾運算符 — 我們將在以下各部分依次介紹每一種運算符。
test 文件運算符
利用這些運算符,您可以在程序中根據對文件類型的評估結果執行不同的操作:
-b file 如果文件為一個塊特殊文件,則為真
-c file 如果文件為一個字符特殊文件,則為真
-d file 如果文件為一個目錄,則為真
-e file 如果文件存在,則為真
-f file 如果文件為一個普通文件,則為真
-g file 如果設置了文件的 SGID 位,則為真
-G file 如果文件存在且歸該組所有,則為真
-k file 如果設置了文件的粘著位,則為真
-O file 如果文件存在并且歸該用戶所有,則為真
-p file 如果文件為一個命名管道,則為真
-r file 如果文件可讀,則為真
-s file 如果文件的長度不為零,則為真
-S file 如果文件為一個套接字特殊文件,則為真
-t fd 如果 fd 是一個與終端相連的打開的文件描述符(fd 默認為 1),則為真
-u file 如果設置了文件的 SUID 位,則為真
-w file 如果文件可寫,則為真
-x file 如果文件可執行,則為真
?
?
SHELL test [命令用法(二)??
2011-10-24 20:23:52|??分類:速記|??標簽:|字號大中小?訂閱
原文地址:http://www.examw.com/linux/all/114977/index.html
以下示例顯示了此簡單操作的運行情況:
$ ls -l
total 33
drwxr-xr-w 2 root root 1024 Dec 5 05:05 LST
-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 karen
-rw------- 1 emmett users 152 Feb 6 07:29 kristin
-rw-r--r-- 1 emmett users 152 Feb 6 07:29 spencer
$
$ test -r evan
$ echo $?
0
$ test -r walter
$ echo $?
1
$
由于第一次評估為真 — 文件存在且可讀 — 返回值為真,或 0。由于第二次評估的文件不存在,該值為假,返回值不為零。將值指定為零或非零很重要,因為在失敗時不會始終返回 1(雖然這是通常返回的值),可能返回一個非零值。
正如開頭所提到的,除了使用 test 外,您還可以用方括號 [ ] 將命令括住來向 shell 發出同樣的命令 — 如下所示:
$ [ -w evan ]
$ echo $?
0
$ [ -x evan ]
$ echo $?
1
$
同樣,第一個表達式為真,第二個表達式為假 — 正如返回值所指示的那樣。您還可以使用以下命令將兩個文件彼此進行比較:
file1 -ef file2 測試以判斷兩個文件是否與同一個設備相連,是否擁有相同的 inode 編號
file1 -nt file2 測試以判斷第一個文件是否比第二個文件更新(由修改日期決定)
file1 -ot file2 測試以判斷第一個文件是否比第二個文件更舊
以下示例顯示了使用這些運算符比較文件的結果:
$ [ evan -nt spencer ]
$ echo $?
0
$ [ karen -ot spencer ]
$ echo $?
1
$
名為 evan 的文件比名為 spencer 的文件更新,因而評估為真。類似地,名為 karen 的文件比名為 spencer 的文件更新,因此該評估為假。
字符串比較運算符
如標題所示,這組函數比較字符串的值。您可以檢查它們是否存在、是否相同或者是否不同。
String 測試以判斷字符串是否不為空
-n string 測試以判斷字符串是否不為空;字符串必須為 test 所識別
-z string 測試以判斷字符串是否為空;字符串必須為 test 所識別
string1 = string2 測試以判斷 string1 是否與 string2 相同
string1 != string2 測試以判斷 string1 是否與 string2 不同
對任何變量進行的最有用的測試之一是判斷它的值是否不為空,可以簡單地將其放在 test 命令行中執行這種測試,如下例所示:
$ test "$variable"
強烈建議進行此種測試時用雙引號將變量括住,以讓 shell 識別變量(即使變量為空)。默認情況下執行的基本字符串評估和 -n 測試從功能上講是相同的,如以下示例所示:
#example1
if test -n "$1"
then
echo "$1"
fi
執行以上例子中的代碼將根據 $1 是否存在給出以下結果:
$ example1 friday
friday
$
$ example1
$
如果將代碼更改為以下形式,則結果將相同:
#example2
if test "$1"
then
echo "$1"
fi
如下所示:
$ example2 friday
friday
$
$ example2
$
所有這些表明,通常不需要 -n,它代表默認操作。
要從一個不同的角度來查看各種可能性,您可以用另一個選項來替換 -n,并檢查該值是否為空(相對于非空)。這可以用 -z 選項來實現,代碼為:
#example3
if test -z "$1"
then
echo "no values were specified"
fi
運行如下:
$ example3
no values were specified
$ example3 friday
$
如果在沒有命令行參數的情況下運行該程序,而表達式評估為真,那么將執行程序塊中的文本。如果在命令行中有值,則腳本退出,不執行任何操作。將評估操作放在腳本的開頭非常有用,這可以在可能產生錯誤的進一步處理之前預先檢查變量值
總結
以上是生活随笔為你收集整理的SHELL test [ 命令用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lucene两个分页操作
- 下一篇: RS232和RS485协议原理和应用