Linux shell之eval、``与$()

eval、``、$()是Linux Shell下,三种个功能类似的命令,都可以用来命令替换。

特别需要注意的是第二个` `这两个字符不是单引号,是反引号,在标准美国键盘上的ESC键下面,在字符1左边,在TAB键上面的那个键,要特别留心。

eval探究:

eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。

也就是说,eval命令有两步。

  1. 第一步,扫描,并置换。类似于C语言中编译期间的宏替换
  2. 第二部,执行替换之后的命令。类似于C语言运行期间,将替换后的值带入程序中运行计算。
这是eval最重要的功能。该命令适用于那些一次扫描无法实现其功能的变量,该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时被称为复杂变量。不过这些变量本身并不复杂。eval命令也可以用于回显简单变量,不一定是复杂变量。当然,eval还有许多其他的用法,下面一一介绍:

1,eval用来显示复杂变量(变量是表示命令的字符串)

可以发现:
eval将$NAME进行扫描,替换为字符串命令“ll -i”,然后执行该命令。


可以发现:
在上面的代码中,用NAME2=NAME,但是执行eval NAME2时,第一步走完后,将该命令行替换为NAME,然后执行NAME。
但是,NAME并不是可执行命令,而NAME需要再次替换为“ll -i”,才能执行。所以,显示“NAME:command not found”。

2,eval用来显示简单变量,而不是复杂变量。

可以发现:
NAME2表示简单变量时,直接"eval $NAME2"会显示“VALUE:command not found”错误,道理和上面叙述一样。
echo $NAME2显示出来了NMAE2本该替换的值VALUE。
而eval echo $NAME2也显示了VALUE,是因为eval扫描本命令行,将$NAME2替换成了VALUE,本命令行变为了“echo VALUE”,所以,执行之后,当然显示VALUE了。

3,eval用来显示传递给脚本的最后一个参数
创建一个test.sh文件,写入如下内容

在命令行中输入如下命令,显示:

可以发现,最后一句话,显示的是传递给脚本的最后一个参数。

因为:$#表示的是参数个数,而$5显示传递的第5个参数值。

所以,eval  echo \$$#,第一步,替换为“echo $5”,然后,第二步,执行该命令,就显示arg5.



``简介:

使用``(反引号)引住的命令执行结果能赋值给一个变量。它也被称为后引号(backquotes)或是斜引号(backticks)。

比如:如下示例图:


(注:本人的hostname是ubuntu)

可以发现:该A用来存放命令的结果。使用$A提示的是,该变量表示的内容不是一个命令,说明了bash是直接将$A看做是A表示的内容。使用echo可以直接打印出来。

与eval不同的是:

eval是先替换,再运行。

而``却是提前将结果放在了变量中。可以看做是,先运行放在变量中,然后在使用时候,替换。


$()简介:
$()的使用于``类似。Shell扫描命令行,发现了$(command)结构,便将$(command)中的command执行一次,得到其标准输出,再将此输出放到原来命令行中$(command)的位置,即替换了$(command),再执行整个命令行。
可以发现,两者功能,基本相同。所以与eval的区别和``一样。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章