bash里面的命令替换

bash脚本里面通常去要把一个命令的输出赋给一个变量,或者拼凑出一个新的字符串,这个时候就需要使用命令替换功能,英文是Command Substitution。

命令替换就是使用命令的输出用来替换命令名的一种方式。总共有两种形式。

第一种

$(command)

第二种

`command`

bash在执行的时候就会使用命令输出到标准输出设备(stdout)的信息来替换这个表达式。

末尾的换行符都会被删除。但是输出中间的换行符会得到保留。

如果是需要获得文件内容的话,可以使用

$(cat 文件名)

不过这个可以写成

$(< 文件名)

手册上说这种方式速度更快,但是没有提快在什么地方。我猜想应该是cat调用了一个外部的程序,而使用

推荐是用第一种带括号的方式,使用`符号是比较旧的写法。

在使用`符号做命令替换的时候需要注意\符号需要转意。如果你的命令本来就需要$, `, \符号,那么你需要在前面使用\。而是用第一种方式,你只需关注命令本身的\转意了。

比如你要ls一个文件,名字就是`dd,那命令是

ls \`dd
ls: cannot access '`dd': No such file or directory

使用第一种方式做命令替换

$(ls \`dd)

而使用第二种方式则需要做两层的转意

`ls \\\`dd`

命令替换还支持嵌套,但是使用第二中用法的时候,内部的`符号,要使用\转意

第一种用法

a=$(echo abc $(echo qq))

第二种用法

b=`echo abc \`echo qq\``

如果命令替换被放在双引号内,那么单词分隔(word splitting),和路径扩展(pathname expansion)就不会针对替换的结果执行。

比如

echo $(echo "*")
输出
Destop Documents Downloads ....

但是放在双引号中,输出只是一个*号

echo "$(echo "*")"
输出
*


分享到:


相關文章: