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编程时经常用的到将系统命令的执行结果赋给一个变量
注意:反引号内不能再引用反引号,而$()中可以引用反引号