在说eval、反引号以及${}的区别之前,先看看什么是命令代换?
所谓命令代换其实是:shell执行命令并将命令替换部分替换为执行该命令后的结果(先执行该命令,然后用结果代换到命令行中)
而在命令代换方式又分了三种:
1) 反引号(••):就是‘~’处的那个符号,
2) $():
3) eval:
接下来分别看看他们功能和作用:
- 反引号(••):就是‘~’处的那个符号,反引号执行命令代换时,会对命令中包含的‘\’进行跳脱处理;
- $():相当于C语言当中的();用于算术运算
以下例子说明反引号和$()的区别:
例子1:
因为shell里的单引号会保持所有字符的字面值,所以引号里的执行结果应该是 \ ;
但是用反引号输出的结果却是 \ ,这就是由于它对 \ 进行了跳脱处理。
例子2:
两者执行结果一样,都是执行命令并将命令替换部分替换为执行该命令后的结果;
3、 eval:
1) 功能:告知shell取出eval的参数,重新运算求出参数的内容;
语法形式:eval [参数] —–其中参数不限数目,彼此之间用分号分开。
a) eval可读取一连串的参数,然后再依参数本身的特性来执行。
b) ‘参数’是在终端上键入的一条普通命令行。然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次,再次运算求出参数的内容。
注意:如果变量中包含任何需要shell直接在命令行中看到的字符(不是替换的结果),就可以使用eval。命令行结束符(; | &),I/o重定向符(< >)和引号就属于对shell具有特殊意义的符号,必须直接出现在命令行中。
2).取得最后一个参数
例子1:
例子2:
3).以下示意如何用eval命令创建指向变量的“指针”: