一、$()``

在 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. logstash服务启动脚本
  2. Android开发之XUtils框架使用和报错处理
  3. 用于阻止div上的事件和div上的按钮的事件同时触发
  4. AC日记——合法C标识符 openjudge 1.7 06
  5. c# 集合适配器
  6. 重构第9天:提取接口(Extract Interface)
  7. linux编译安装MySQL
  8. 值类型的Constructor
  9. Java8 Stream API
  10. jquery+NHibernate3.3.3+MVC的分页效果
  11. 【USACO 1.1.1】你的飞碟在这儿
  12. ROS使用rqt_console
  13. Oracle定时执行存储过程(转)
  14. 从头来之【图解针对虚拟机iOS开发环境搭建】 (转)
  15. 【one day one linux】grep工具
  16. 模板 m&#250; bǎn
  17. C# 中的相对路径在 Picturebox 中的应用
  18. 解决只能root权限登陆mysql的问题
  19. trajan
  20. ES系列十八、FileBeat发送日志到logstash、ES、多个output过滤配置

热门文章

  1. 容灾管理中的RTO与RPO的关系
  2. (二)Fiddler抓取Firefox、Chrome浏览器上的https协议
  3. ubuntu :安装好了搜狗输入法但是没法用
  4. FPGA设计中的float
  5. 安卓5.0宣告了ARM平台全面进入64位时代
  6. 转-SpringMVC——之 国际化
  7. 分布式事务之:TCC几个框架的测试情况记录
  8. Angular2快速入门-4.创建一个服务(创建NewsService提供数据)
  9. 异步编程之co——源码分析
  10. 03-23 MVC框架(以查询、删除为例)