linux eval(变量动态传递)


语法:eval cmdLine

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

 


## eval用例 ##

#例一:
#寻找合符条件的变量名,然后将该变量的值赋予另一变量
v1=aaa
v2=bbb
c=1
if [ $c -eq 1 ]
then
  vname=v$c   #找到符合条件的变量名为v1
  eval vvv="$"$vname ; echo vvv: $vvv    #将变量v1的值赋予vvv,即,使vvv=aaa
  eval vvv='$'$vname ; echo vvv: $vvv    #将变量v1的值赋予vvv,即,使vvv=aaa
#eval vvv=$$vname   ; echo vvv: $vvv    #错误用法
fi


#例二:#以变量v1的值aaa作为变量名,将变量vaaa的值赋予这一新定义的变量aaa
v1=aaa ; vaaa="This is aaa"
#eval $v1=$vaaa    ; echo aaa: $aaa    #错误用法
#eval $v1="$vaaa"  ; echo aaa: $aaa    #错误用法
eval $v1='$vaaa'   ; echo aaa: $aaa


#例三:
#以变量v1的值aaa作为变量名,并将变量名字串作为值赋予自身
v1=aaa ; vaaa="This is aaa"
eval $v1=$v1   ; echo aaa: $aaa    #与例二的错误用法不同,这一用法是正确的
eval $v1="$v1" ; echo aaa: $aaa    #与例二的错误用法不同,这一用法是正确的
eval $v1='$v1' ; echo aaa: $aaa

#例四:


set 11 22 33 44

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

echo $4

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

如果使用命令:

echo "\$$#"

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

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

eval echo "\$$#"

得到的结果为44



请使用浏览器的分享功能分享到微信等