eval解析及反引号与$()区别

eval

语法:eval cmdLine

     eval会对后面的cmdLine进行两遍扫描,如果第一遍扫描后,cmdLine是个普通命令,则执行此命令;如果cmdLine中含有变量的间接引用,则保证间接引用的语义。

1. eval命令将会首先扫描命令行进行所有的替换,然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时候被称为复杂变量。

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

NAME=ZONE

eval echo $NAME等价于echo $NAME

3.两次扫描

test.txt内容:hello shell world!

myfile=”cat test.txt”

(1)echo $myfile  result:cat test.txt

(2)eval echo $myfile  result:hello shell world!

从(2)可以知道第一次扫描进行了变量替换,第二次扫描执行了该字符串中所包含的命令

4.获得最后一个参数

例如:set 11 22 33 44

(1) 如果要输出最近一个参数,即44,可以使用如下命令:

echo $4

(2) 如果我们不知道有几个参数的时候,要输出最后一个参数,大家可能会想到使用$#来输出最后一个参数,
如果使用命令:

echo "\$$#"

//则得到的结果是 $4,而不是我们想要的44。这里涉及到一个变量间接引用的问题,我们的本意是输出 $4,默认情况下,命令后忽略变量间接引用的情况。

(3) 这时候,就可以使用eval命令。

eval echo "\$$#"

得到的结果为44

$()和反引号的区别

    反引号和 $() 的功能是命令替换,将反引号或$()中的字符串做为命令来执行,我们在用shell编程时经常用的到将系统命令的执行结果赋给一个变量

注意:反引号内不能再引用反引号,而$()中可以引用反引号

你可能感兴趣的:(eval解析及反引号与$()区别)