Linux:shell脚本之命令替换(eval,反引号和$())

       shell脚本是一门解释型而非编译型的语言 。       

       命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置。shell中有两种方法作命令替换:把shell命令用反引号或者$(...)结构括起来,其中,$()格式受到POSIX标准支持,也利于嵌套。


一、反引号(``)与$()的区别:


例如:



运行结果:




由上可知:反引号中\$并没有将$的特殊意义转换 ,反引号包含的内容 echo \$hostname 仍然被解释为一个echo, $HOSTNAME 取到了这个变量的值并输出

$()则正好相反,$明显被\转义成了一个普通字符,所以并没有取到变量值,而是返回了字符串本身的意思,故而返回了$HOSTNAME


这说明反引号对反斜杠(\)有特殊的转化,至少我们看到当我们直接用1个\时,它本身并不会起到转义的作用。现在我们将脚本的内容做一些修改:



运行结果:



此时可以看出和第一次的结果完全相反:

反引号反而输出了$HOSTNAME的字面意思

$()如我们所愿的取到了变量值,并理所应当的输出了一个被转义的字符串\


由此,我们可以得出结论:

1.反引号齐本身就对\进行了转义,保留了其本身意思,如果我们想在反引号中起到\的特殊意义,我们必须使用2个\来进行表示。所以我们可以简单的想象成反引号中: \\ = \

2.$()中则不需要考虑\的问题,与我们平常使用的一样:\ = \


采用$( )的理由

1. ` `很容易与' '(单引号)搞混。有时在一些奇怪的字形显示中,两种符号是一模一样的(直竖两点)。
2. 在多层次的符合替换中,``需要额外的跳脱(\`)处理
,而$( )则比较直观。例如:
command1 `command2 `command3` `
原本的意图是在command2 `command3`中先将command3替换出来给command2处理,然后再将结果传给command1 `command2 ...`来处理。
然而,真正的结果在命令行中却是分成了`command2`与` `两段。
正确的输入应该如下:
command1 `command2 \`command3\` `
换成$( )则一目了然:
command1 $(command2 $(command3))

$( )的不足

` `基本上可在全部的unix shell中使用,若写成shell script移植性比较高。而$( )并不是每一种shell都能使用。


二、eval


功能说明:告知shell取出eval的参数,重新运算求出参数的内容。
语  法:eval [参数]
补充说明:eval可读取一连串的参数,然后再依参数本身的特性来执行。
参  数:参数不限数目,彼此之间用分号分开。


1.eval首先扫描命令行进行所有的替换,然后再去执行命令。这个命令用于那些一次扫描无法实现它功能的变量,这个变量进行两次扫描,这些需要进行两次扫描的变量也叫做复杂变量。


运行结果:


这个eval和echo的区别eval首先进行一遍扫描,进行变量的替换,然后进行第二次扫描,进行执行替换后的命令


2.eval还有一个作用,可以用来取得传给shell脚本的最后的一个参数


运行结果:


第一遍扫描后,shell把反斜杠去掉了。当shell再次扫描该行时,它替换了$4的值,并执行echo命令


3.eval也可以用于回显简单变量,不一定是复杂变量


猜你喜欢

转载自blog.csdn.net/if9600/article/details/74221548
今日推荐