By francis_hao Oct 1,2017
本文摘錄自bash的man手冊
條件表達式
條件表達式是由復合命令 [[ 或內置命令 test 和 [ 使用的,用於測試文件屬性和字符串或數值比較。表達式形式如下表所示,如果其中的file形式為/dev/fd/n,那么將測試文件描述符n,如果file是/dev/stdin, /dev/stdout 或 /dev/stderr。那么將測試文件描述符0,1和2。除非有其他指定,否則,測試一個連接都是測試其指向的文件,而不是連接本身。
表達式 |
說明 |
文件屬性測試 |
|
-a file |
如果file存在則為真 |
-b file |
如果file存在且為塊文件則為真 |
-c file |
如果file存在且為字符文件則為真 |
-d file |
如果file存在且是目錄則為真 |
-e file |
如果file存在則為真 |
-f file |
如果file存在且為普通文件則為真 |
-g file |
如果file存在且置位設置-組ID則為真,見參考【1】第4.4、12.3節 |
-h file |
如果file存在且為符號連接則為真 |
-k file |
如果file存在且其粘性位置位則為真,參考man chmod |
-p file |
如果file存在且為命令管道(FIFO)則為真 |
-r file |
如果file存在且可讀則為真 |
-s file |
如果file存在且文件長度大於0則為真 |
-t fd |
如果文件描述符fd打開且指向為終端則為真 |
-u file |
如果file存在且設置-用戶-ID置位則為真,見參考【1】第4.4節 |
-w file |
如果file存在且可寫則為真 |
-x file |
如果file存在且可執行 |
-G file |
如果file存在且由有效組ID擁有則為真,見參考【1】第4.4節 |
-L file |
如果file存在且為符號連接則為真 |
-N file |
如果file存在且在上次讀后有修改(modified)則為真 |
-O file |
如果file存在且由有效用戶ID擁有則為真,見參考【1】第4.4節 |
-S file |
如果file存在且是一個套接字則為真 |
file1 -ef file2 |
如果file1和file2指向同一個設備的inode則為真 |
file1 -nt file2 |
如果file1比file新(modified),或者file1存在file2不存在在為真 |
file1 -ot file2 |
如果file1比file舊(modified),或者file1存在file2不存在在為真 |
shell相關 |
|
-o optname |
如果shell選項optname使能則為真,參考內置指令set的-o選項 |
-v varname |
如果shell變量varname被設置則為真 |
字符串測試 |
|
-z string |
如果string長度為0則為真 |
string -n string |
如果string長度不為0則為真 |
string1 == string2 string1 = string2 |
如果string1和string2相等則為真,=只應由test使用 |
string1 != string2 |
如果字符串不相等則為真 |
string1 < string2 |
如果按字典序string1在string2之前則為真 |
string1 > string2 |
如果按字典序string1在string2之后則為真 |
數值測試 |
|
arg1 OP arg2 |
OP是-eq, -ne, -lt, -le, -gt, 或 -ge的其中之一,數值可正可負。 |
復合命令[[
[[ expression ]]
根據條件表達式expression的結果返回0或1。在[[和]]中,字分割和路徑擴展不會執行,其他擴展都會執行,條件操作符,像-f,必須是非引用的,以被識別為操作符。<和>操作符使用當前的locale進行字典排序。
在使用==和!=操作符時,右側的操作數可以是一個模式(Pattern Matching),如果要匹配這個模式本身,使用引號引起來即可。
另一個可用的二元操作數,=~,與==和!=的優先級相同。當使用它時,右側的操作數被認為是一個擴展的正則表達式(見參考【2】),如果使能shell的選項nocasematch,那么表達式對大小寫不敏感。
expression可以使用以下操作符進行結合,優先級由高到低排序
操作符 |
說明 |
( expression ) |
用來改變優先級 |
! expression |
expression的結果取反 |
expression1 && expression2 |
邏輯與,如果expression1足夠說明整個表達式的真假,那么expression2不會被求值 |
expression1 || expression2 |
邏輯或,如果expression1足夠說明整個表達式的真假,那么expression2不會被求值 |
內置命令test和[
test expr
[ expr ]
根據條件表達式expr的結果返回0或1,每個操作符和操作數必須是分開的參數,test不接受任何選項,甚至表示參數結束的--也不接受。
表達式可以由以下操作符進行結合,優先級由高到低排序
操作符 |
說明 |
! expr |
expr的結果取反 |
( expr ) |
用來改變優先級 |
expr1 -a expr2 |
邏輯與 |
expr1 -o expr2 |
邏輯或 |
<和>操作符使用ASCII進行字典排序。
本文由 劉英皓 創作,采用 知識共享署名-非商業性使用-相同方式共享3.0中國大陸許可協議 進行許可。歡迎轉載,請注明出處:
轉載自:http://www.cnblogs.com/yinghao1991/p/7617965.html
參考
【1】W.Richard Stevens, Stephen A.Rago著 戚正偉 張亞英 尤晉元譯 《UNIX環境高級編程(第3版)》北京:人民郵電出版社 2014.6
【2】博客園 http://www.cnblogs.com/yinghao1991/p/7617004.html POSIX.2 正則表達式
【3】man sh