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 "*")"
输出
*
閱讀更多 zhangyiant 的文章