使用 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 之类比较操作符。 |