`和
()都是命令替换符。由反引号括起来的也是⼀条命令,Shell先执⾏该命令,然后将输出结果⽴刻代换到当前命令⾏中。命令代换也可以⽤
()表⽰: DATE=
(date)
(())⽤于算术计算,
(())中的Shell变量取值将转换成整数,例如:
VAR=45
echo
((
VAR+3))
(())中只能⽤+-*/和()运算符,并且只能做整数运算
那么`和$()在命令替换时有什么区别呢
`和$()在用到\时,有了差别,下面举个例子来说明这个问题
echo `echo \\w `
echo $(echo \\w )
为什么有这样不同的结果呢?
在举个例子
当直接执行echo \$HOSTNAME
语句时,结果为$HOSTNAME
当直接执行echo $HOSTNAME
语句时,结果为localhost.localdomain
现在编写这样两句程序
echo `echo \$HOSTNAME`
echo $(echo \$HOSTNAME)
结果分别为localhost.localdomain和
HOSTNAME,这说明在用反引号时,并没有将反斜杠(\)做反义字符对待,所以$没有将
的特殊意义转换,将被解释为echo localhost.localdomain
,结果为localhost.localdomain。
在用
()时,将反斜杠(\)做反义字符对待,所以$将
的特殊意义转换,所以将被解释为echo \$HOSTNAME
,结果为$HOSTNAME。
这说明在反引号(`)中一个反斜杠()并没有转义的作用。
现在多增加几个反斜杠看看结果
echo `echo \\$HOSTNAME`
echo $(echo \\$HOSTNAME)
这次结果有了变化,分别为
$HOSTNAME
\localhost.localdomain
这就说明echo
echo $HOSTNAME被解释成了
echo \$HOSTNAME
,而echo $(echo \\$HOSTNAME)
被解释成了echo \localhost.localdomain
。
为什么这次又会是这个结果呢?
其实还是和\有关,在`中一个\不做转义字符处理,但是两个就要做转义字符处理。在$()中一个做转义字符处理,所以有两个\时,就被处理成了一个\。