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

posted on 2017-10-01 21:47  刘英皓  阅读(11813)  评论(0编辑  收藏  举报