[置顶] shell脚本中命令代换:反引号、$()、eval区别

时间:2021-01-19 21:45:56

在说eval、反引号以及${}的区别之前,先看看什么是命令代换?

所谓命令代换其实是:shell执行命令并将命令替换部分替换为执行该命令后的结果(先执行该命令,然后用结果代换到命令行中)

而在命令代换方式又分了三种:
1) 反引号(••):就是‘~’处的那个符号,
2) $():
3) eval:

接下来分别看看他们功能和作用:

  1. 反引号(••):就是‘~’处的那个符号,反引号执行命令代换时,会对命令中包含的‘\’进行跳脱处理;
  2. $():相当于C语言当中的();用于算术运算

以下例子说明反引号和$()的区别:
例子1:
[置顶]        shell脚本中命令代换:反引号、$()、eval区别
因为shell里的单引号会保持所有字符的字面值,所以引号里的执行结果应该是 \ ;
但是用反引号输出的结果却是 \ ,这就是由于它对 \ 进行了跳脱处理。

例子2:
[置顶]        shell脚本中命令代换:反引号、$()、eval区别

[置顶]        shell脚本中命令代换:反引号、$()、eval区别
两者执行结果一样,都是执行命令并将命令替换部分替换为执行该命令后的结果;

3、 eval:

1) 功能:告知shell取出eval的参数,重新运算求出参数的内容;
语法形式:eval [参数] —–其中参数不限数目,彼此之间用分号分开。
a) eval可读取一连串的参数,然后再依参数本身的特性来执行。
b) ‘参数’是在终端上键入的一条普通命令行。然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次,再次运算求出参数的内容。

注意:如果变量中包含任何需要shell直接在命令行中看到的字符(不是替换的结果),就可以使用eval。命令行结束符(; | &),I/o重定向符(< >)和引号就属于对shell具有特殊意义的符号,必须直接出现在命令行中。

2).取得最后一个参数

例子1:
[置顶]        shell脚本中命令代换:反引号、$()、eval区别

[置顶]        shell脚本中命令代换:反引号、$()、eval区别

例子2:

[置顶]        shell脚本中命令代换:反引号、$()、eval区别

[置顶]        shell脚本中命令代换:反引号、$()、eval区别

3).以下示意如何用eval命令创建指向变量的“指针”: