一、$()``

在 bash shell 中,$( ) 与 ` ` (反引号) 都是用来做命令替换(command substitution)用的。

所谓的命令替换与我们第五章学过的变量替换差不多,都是用来重组命令行:完成引号里的命令行,然后将其结果替换出来,再重组命令行。

例如:

$ echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)

虽然$()与``在功能上区别不大,但是在使用上也有差别:

1. 在多层次的复合替换中,` ` 须要额外的跳脱( \` )处理,而 $( ) 则比较直观。

例如,这是错的:

command1 `command2 `command3` `

原本的意图是要在 command2 `command3` 先将 command3 提换出来给 command 2 处理,然后再将结果传给command1 `command2 ...` 来处理。然而,真正的结果在命令行中却是分成了`command2 `与 ``两段。

正确的输入应该如下:

command1 `command2 \`command3\` `

如果换成 $( ) 就没问题了:

command1 $(command2 $(command3))

2. 使用范围上,` `基本上可用在全部的 unix shell 中使用,若写成 shell script ,其移植性比较高。而$( )并不见的每一种shell都能使用

 

二、${}

它是用来作变量替换的,详情参考1.07变量

三、$(( ))

它是用来作整数运算的。

在 bash 中,$(( )) 的整数运算符号大致有这些:

+ - * / :分别为 "加、减、乘、除"。

% :余数运算

& | ^ !:分别为 "AND、OR、XOR、NOT" 运算。

例:

$ a=5; b=7; c=2

$ echo $(( a+b*c ))

19

$ echo $(( (a+b)/c ))

6

$ echo $(( (a*b)%c))

1

在 $(( )) 中的变量名称,可于其前面加 $ 符号来替换,也可以不用,如:

$(( $a + $b * $c)) 也可得到 19 的结果

此外,$(( )) 还可作不同进位(如二进制、八进位、十六进制)作运算呢,只是,输出结果皆为十进制而已:

echo $((16#2a)) 结果为 42 (16进位转十进制)

以一个实用的例子来看看吧:

假如当前的??umask 是 022 ,那么新建文件的权限即为:

$ umask 022

$ echo "obase=8;$(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc

644

事实上,单纯用 (( )) 也可重定义变量值,或作 testing:

a=5; ((a++)) 可将 $a 重定义为 6

a=5; ((a--)) 则为 a=4

a=5; b=7; ((a < b)) 会得到??0 (true) 的返回值。

常见的用于 (( )) 的测试符号有如下这些:

<:小于

>:大于

<=:小于或等于

>=:大于或等于

==:等于

!=:不等于

不过,使用 (( )) 作整数测试时,请不要跟 [ ] 的整数测试搞混乱了。

四、参考

1. 《shell十三问》

(完)

随机推荐

  1. 嵌入式无法使用QAudioDeviceInfo类

    修改: 1.修改pro文件 增加    QT += multimedia 2.修改Makefile文件,LIBS = $(SUBLIBS)  -L/opt/qt-4.8.5/lib -lQtMulti ...

  2. 利用OsCache实现后端轮循

    轮循随处可见,最常用的是APP首页的一些促销活动,一两秒切换一张图片,让前端实现起来也不难.这里说下后端的轮循,实现原理是数组+缓存.将数组放入缓存,指定缓存失效时间,如果是在失效前从缓存中取数据,那 ...

  3. MOSS 2013研究系列---Win2008R2 建立域控时候,报密码不符合要求解决办法

    今天远程给Win2008R2装AD域控的时候,突然报如下的错误页面: 修改了密码,将密码强度设置复杂了,但是,仍然会弹出这个错误页面,估计是因为远程账号的关系,于是再网上搜下了一下,找到了一个解决方案 ...

  4. curl 无法访问 https 协议

    转自http://blog.mutoo.im/2013/12/curl-could-not-communicate-with-https-sites.html mac升级为10.10以后,homebr ...

  5. 嵌入ARM硬核的FPGA

    目前,在FPGA上嵌入ARM硬核的包括Xilinx的zynq系列以及Intel 的CYCLONEV系列. Zynq出来有一定市场,但是这个市场不是传统FPGA的主流市场,而是为了和微处理抢一些控制领域 ...

  6. python is 和 == 的区别

    一.is 和 == 的区别 == 比较 比较的俩边的值 is 比较 比较的是内存地址 id() 二.小数据池 数字小数据池的范围 -5 ~ 256 字符串中如果有特殊字符他们的内存地址就不一样 字符串 ...

  7. 1135 Is It A Red-Black Tree

    题意:给出k个二叉搜索树的前序序列,判断该树是否为红黑树. 红黑树的定义: 结点的颜色非红即黑 根结点的颜色必须是黑色 每个叶子结点(指的是空结点,图中并没有画出来)都是黑色的 如果某个结点为红色,则 ...

  8. Java 版本6下载大全

    Oracle 官方 JDK6 下载地址: 基本包含所有的JDK6版本. 需要登注册相应的账户登录到Oracle官网~ http://www.oracle.com/technetwork/java/ja ...

  9. 使用apache common-io 监控文件变化

    package common.io; import org.apache.commons.io.filefilter.FileFilterUtils; import org.apache.common ...

  10. 第十一章: Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解

    HDFS的体系架构 整个Hadoop的体系结构主要是通过HDFS来实现对分布式存储的底层支持,并通过MR来实现对分布式并行任务处理的程序支持. HDFS采用主从(Master/Slave)结构模型,一 ...