TA的每日心情 | 怒 2016-7-1 19:50 |
---|
签到天数: 81 天 连续签到: 1 天 [LV.6]常住居民II 扫一扫,手机访问本帖
|
您在本教程开头看到的 (( ))复合命令计算一个算术表达式,如果表达式计算为 0,则将退出状态设置为 1,或者如果表达式计算为非 0 值,则设置为 0。请注意,let命令基于最后一个参数计算为 0 还是非 0 值来设置返回状态。 清单 9显示了一些示例。清单9. 来自 (( )) 的返回状态- ian@attic-u15:~$ let x=2 y=2**3 z=y*3;echo $? $x $y $z
- 0 2 8 24
- ian@attic-u15:~$ (( w=(y/x) + ( (~ ++x) & 0x0f ) )); echo $? $x $y $w
- 0 3 8 16
- ian@attic-u15:~$ (( w=(y/x) + ( (~ ++x) & 0x0f ) )); echo $? $x $y $w
- 0 4 8 13
- ian@attic-u15:~$ (( w - w )) ;echo $?
- 1
复制代码
[[ ]]复合命令执行一个条件表达式,并将返回状态设置为 0(true) 或 1(false)。与 (( ))一样,您可以为 [[ ]]复合命令使用更自然的语法来执行文件名和字符串测试。通过使用圆括号和逻辑运算符,您可以将 test命令可运行的测试组合在一起。参见 清单 10。
清单 10. 来自 [[ ]] 的返回状态- ian@attic-u15:~$ [[ ( -d "$HOME" ) && ( -w "$HOME" ) ]]; echo $?
- 0
- ian@attic-u15:~$ [[ ( -d "$HOME" ) && ( -w "$HOME" ) ]] &&
- > echo "home is a writable directory"
- home is a writable directory
复制代码
当使用 ==或 !=运算符时,您可以使用 [[ ]]复合命令在字符串上执行模式匹配。该匹配行为与 shell 通配符语法相同,如 清单 11中所示。
清单 11. 使用 [[ ]] 的通配符测试- ian@attic-u15:~$ [[ "abc def .d,x--" == a[abc]*\ ?d* ]]; echo $?
- 0
- ian@attic-u15:~$ [[ "abc def c" == a[abc]*\ ?d* ]]; echo $?
- 1
- ian@attic-u15:~$ [[ "abc def d,x" == a[abc]*\ ?d* ]]; echo $?
- 1
复制代码
在 [[ ]]中,==和 =拥有相同的含义,所以您可以使用任意一个。如果您希望模式是正则表达式而不是 shell 通配符语法,那么可以使用 =~。参见 清单 12。
清单 12. 使用 [[ ]] 的正则表达式模式匹配- ian@attic-u15:~$ # Wildcard globbing does not match this pattern
- ian@attic-u15:~$ [[ "abc def c" == a[abc]*\ ?d* ]]; echo $?
- 1
- ian@attic-u15:~$ # But regular expression matching does
- ian@attic-u15:~$ [[ "abc def c" =~ a[abc]*\ ?d* ]]; echo $?
- 0
复制代码
您甚至可以在 [[ ]]复合命令内执行算术测试,但要小心。除非它们在一个嵌套的 (( ))复合命令内,否则 <和 >运算符会将操作数当作字符串来比较,并测试它们在当前核对序列中的顺序。 清单 13通过一些示例演示了这种行为。
清单 13. [[ ]] 中的算法测试- ian@attic-u15:~$ # Set warning in case we use an unbound variable
- ian@attic-u15:~$ # Otherwise names are interpreted as strings
- ian@attic-u15:~$ set -u
- ian@attic-u15:~$ # First expression is false
- ian@attic-u15:~$ [[ "abc def d,x" == a[abc]*\ ?d* ]]; echo $?
- 1
- ian@attic-u15:~$ [[ "abc def d,x" == a[abc]*\ ?d* || (( 3 > 2 )) ]]; echo $?
- 0
- ian@attic-u15:~$ [[ "abc def d,x" == a[abc]*\ ?d* || 3 -gt 2 ]]; echo $?
- 0
- ian@attic-u15:~$ [[ "abc def d,x" == a[abc]*\ ?d* || 3 > 2 ]]; echo $?
- 0
- ian@attic-u15:~$ [[ "abc def d,x" == a[abc]*\ ?d* || a > 2 ]]; echo $?
- 0
- ian@attic-u15:~$ [[ "abc def d,x" == a[abc]*\ ?d* || a -gt 2 ]]; echo $?
- bash: a: unbound variable
- ian@attic-u15:~$ # Restore default
- ian@attic-u15:~$ set +u
复制代码
|
|