shell中的條件表達式
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
shell中的條件表達式