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