曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6112|回复: 0
打印 上一主题 下一主题

(( ))和 [[ ]]

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2011-5-30 19:09:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用 let 命令可以执行一个或多个算术表达式,但它一般只用来为为算术变量赋值。

在 shell 中,使用 (( )) 符号可以进行复合命令算术计算,也就是说将多个运算表达式放在 (( )) 中进行运算。比如下面的 shell 脚本:
[Bash shell] 纯文本查看 复制代码
#!/bin/bash

let x=2 y=2**3

(( w=(y/x) + ( (~ ++x) & 0x0f) ))

echo $? w=$w

运行输出:
[beyes@localhost shell]$ sh cal.sh
0 w=16
脚本中先用 let 命令为各变量进行复制,然后再利用 (( )) 进行算术计算,尽管 let 命令也可以计算,但用 (( )) 更为方便直观,因为在 (( )) 中不需要用转义符才能使用运算符号(参考 let 命令:http://www.groad.net/bbs/read.php?tid-3630.html)。
在 (( )) 中的表达式如果最后结算结果为 0,那么整个 (( )) 运算返回 1,反之返回 0 。

类似的,在 [[ ]] 中可以进行字符串的比较,如:
[beyes@localhost shell]$ [[ ( -d "$PWD" ) && ( -w "$PWD" ) ]] && echo "Current directory is $PWD and it is writable"
Current directory is /home/beyes/shell and it is writable
上面测试 $PWD 变量是否为一个目录,然后 -w 选项判断其是否可写,如果这两个条件都为真,那么执行后边那条 echo 语句输出。

顺便说一点,&& 是 逻辑与 运算符,通常在脚本里用它表示,只要前面的命令执行成功,才会执行它后面的命令。其意思就是,如果前面的条件(命令)为假,那么就不需要再判断后面的条件(执行后面一条语句)。

在 [[ ]] 中还可以使用通配符:
[beyes@localhost ~]$ [[ "./ is represent current-directory" == ?/\ i* ]]; echo $?
上面,? 表示单个字符,它匹配 "." 符号,i 后面的 "*" 号匹配 i 后面的所有内容。

在 [[ ]] 里面还可以进行算术测试:
[beyes@localhost ~]$ [[ "./ is represent current-directory" == ?/\ i* && 3 > 2 ]]; echo $?
0
[beyes@localhost ~]$ [[ "./ is represent current-directory" == ?/\ i* && a > 2 ]]; echo $?
0
[beyes@localhost ~]$ [[ "./ is represent current-directory" == ?/\ i* && a -gt 2 ]]; echo $?
1
[beyes@localhost ~]$ [[ "./ is represent current-directory" == ?/\ i* && 3 -gt 2 ]]; echo $?
0
注意上面的输出,因为在 [[ ]] 中,> 和 < 是比较字符串(ASCII 码)用的,而不是比较整数的,所以在第 3 条测试时输出返回值 1 表示失败;如果要比较整数,则要用 -gt, -ne 之类比较操作符。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 00:06 , Processed in 0.077714 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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