1. 程式人生 > >shell中的條件表達式

shell中的條件表達式

left images ima 分享 p s == www. 出版 字符

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