shell脚本--命令替换``(反引号)与$()的区别与联系

时间:2022-07-16 21:46:23

命令替换就是指shell能够将一个命令的标准输出插在一个命令行中任何位置。

本文介绍两种命令替换:``和$()者两种命令的功能是相同的,在执行一条命令是,会将``或者$()中的语句当做命令执行以便,再把结果加入到原命令中重新执行。

但是两者也有其不同点。比如编写以下脚本运行,两者的运行结果就不相同

#!/bin/bash
echo `echo \$HOSTNAME`
echo $(echo \$HOSTNAME)

我们来看看运行结果:

shell脚本--命令替换``(反引号)与$()的区别与联系

我们可以看出反引号中转义字符并没有改变$的原本作用,$HOSTNAME取到了这个变量值的输出,而$()中$明显被\转义成了一个普通的字符,所以并没有取到$HOSTNAME变量的值,而是被作为一个字符串输出。

建议初学者(比如我)还是先学着使用$()来命令替换吧,原因:

首先,反引号和单引号长得太像了,我们这种小菜鸟很容易将其混淆,而且有一些字体下这两种符号完全没有区别。记住反引号是ESC键下面的那个键哦!

再者,当我们要用到多层次的复合替换的时候若是使用反引号的话就一定要小心了哟,反引号是需要做额外的跳脱处理(/`)的,不然你写的语句很可能就是错误的。比如:`com1`com2``,你其实是想表达com1`com2`为一个替换,内部com2为一个替换,但当你运行时却是错误的,由于你没有跳脱处理。正确的应该是`com1/`com2/``。所以使用的时候仔细一点。

但是$()就比较直观好用啦,直接$(com1$(com2))就可以了,无需其他处理。

结论:在使用命令替换时,如果替换语句中有遇到转义字符\,反引号中相当于\\=\,而$()中\=\。