• 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

  • 相关阅读:
    C++各大有名库的介绍——C++标准库
    转换中文数字成为阿拉伯数字
    nutch 写一个indexingfilter插件
    nutch从网页中提取字段并索引_HtmlParseFilter
    java csv操作类
    简单的有限状态机
    getResource()和getResourceAsStream的路径问题
    eclipse修改整个工作空间的编码
    批处理启动tomcat
    java linq
  • 原文地址:https://www.cnblogs.com/yinghao-liu/p/7617965.html
Copyright © 2020-2023  润新知