新技术论坛
搜索
查看: 669|回复: 0
打印 上一主题 下一主题

shell 教程之三 来自 (( ))和 [[ ]] 的返回状态

[复制链接]
  • TA的每日心情

    2016-7-1 19:50
  • 签到天数: 81 天

    连续签到: 1 天

    [LV.6]常住居民II

    扫一扫,手机访问本帖
    楼主
    跳转到指定楼层
    发表于 2016-3-13 14:49:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

    您在本教程开头看到的 (( ))复合命令计算一个算术表达式,如果表达式计算为 0,则将退出状态设置为 1,或者如果表达式计算为非 0 值,则设置为 0。请注意,let命令基于最后一个参数计算为 0 还是非 0 值来设置返回状态。 清单 9显示了一些示例。
    清单9. 来自 (( )) 的返回状态
    1. ian@attic-u15:~$ let x=2 y=2**3 z=y*3;echo $? $x $y $z
    2. 0 2 8 24
    3. ian@attic-u15:~$ (( w=(y/x) + ( (~ ++x) & 0x0f ) )); echo $? $x $y $w
    4. 0 3 8 16
    5. ian@attic-u15:~$ (( w=(y/x) + ( (~ ++x) & 0x0f ) )); echo $? $x $y $w
    6. 0 4 8 13
    7. ian@attic-u15:~$ (( w - w )) ;echo $?
    8. 1
    复制代码

    [[ ]]复合命令执行一个条件表达式,并将返回状态设置为 0(true) 或 1(false)。与 (( ))一样,您可以为 [[ ]]复合命令使用更自然的语法来执行文件名和字符串测试。通过使用圆括号和逻辑运算符,您可以将 test命令可运行的测试组合在一起。参见 清单 10。
    清单 10. 来自 [[ ]] 的返回状态
    1. ian@attic-u15:~$ [[ ( -d "$HOME" ) && ( -w "$HOME" ) ]]; echo $?
    2. 0
    3. ian@attic-u15:~$ [[ ( -d "$HOME" ) && ( -w "$HOME" ) ]] &&
    4. > echo "home is a writable directory"
    5. home is a writable directory
    复制代码

    当使用 ==或 !=运算符时,您可以使用 [[ ]]复合命令在字符串上执行模式匹配。该匹配行为与 shell 通配符语法相同,如 清单 11中所示。
    清单 11. 使用 [[ ]] 的通配符测试
    1. ian@attic-u15:~$ [[ "abc def .d,x--" == a[abc]*\ ?d* ]]; echo $?
    2. 0
    3. ian@attic-u15:~$ [[ "abc def c" == a[abc]*\ ?d* ]]; echo $?
    4. 1
    5. ian@attic-u15:~$ [[ "abc def d,x" == a[abc]*\ ?d* ]]; echo $?
    6. 1
    复制代码

    在 [[ ]]中,==和 =拥有相同的含义,所以您可以使用任意一个。如果您希望模式是正则表达式而不是 shell 通配符语法,那么可以使用 =~。参见 清单 12。
    清单 12. 使用 [[ ]] 的正则表达式模式匹配
    1. ian@attic-u15:~$ # Wildcard globbing does not match this pattern
    2. ian@attic-u15:~$ [[ "abc def c" == a[abc]*\ ?d* ]]; echo $?
    3. 1
    4. ian@attic-u15:~$ # But regular expression matching does
    5. ian@attic-u15:~$ [[ "abc def c" =~ a[abc]*\ ?d* ]]; echo $?
    6. 0
    复制代码

    您甚至可以在 [[ ]]复合命令内执行算术测试,但要小心。除非它们在一个嵌套的 (( ))复合命令内,否则 <和 >运算符会将操作数当作字符串来比较,并测试它们在当前核对序列中的顺序。 清单 13通过一些示例演示了这种行为。
    清单 13. [[ ]] 中的算法测试
    1. ian@attic-u15:~$ # Set warning in case we use an unbound variable
    2. ian@attic-u15:~$ # Otherwise names are interpreted as strings
    3. ian@attic-u15:~$ set -u
    4. ian@attic-u15:~$ # First expression is false
    5. ian@attic-u15:~$ [[ "abc def d,x" == a[abc]*\ ?d* ]]; echo $?
    6. 1
    7. ian@attic-u15:~$ [[ "abc def d,x" == a[abc]*\ ?d* || (( 3 > 2 )) ]]; echo $?
    8. 0
    9. ian@attic-u15:~$ [[ "abc def d,x" == a[abc]*\ ?d* || 3 -gt 2 ]]; echo $?
    10. 0
    11. ian@attic-u15:~$ [[ "abc def d,x" == a[abc]*\ ?d* || 3 > 2 ]]; echo $?
    12. 0
    13. ian@attic-u15:~$ [[ "abc def d,x" == a[abc]*\ ?d* || a > 2 ]]; echo $?
    14. 0
    15. ian@attic-u15:~$ [[ "abc def d,x" == a[abc]*\ ?d* || a -gt 2 ]]; echo $?
    16. bash: a: unbound variable
    17. ian@attic-u15:~$ # Restore default
    18. ian@attic-u15:~$ set +u
    复制代码




    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    手机版|Archiver|开发者俱乐部 ( ICP/ISP证:辽B-2-4-20110106号 IDC证:辽B-1-2-20070003号 )

    GMT+8, 2024-12-23 23:22 , Processed in 0.125742 second(s), 21 queries .

    X+ Open Developer Network (xodn.com)

    © 2009-2017 沈阳讯网网络科技有限公司

    快速回复 返回顶部 返回列表