http://mingyang.blog.51cto.com/2807508/1550281/
a). eval直接接原生命令, 和直接执行无区别
#eval ls -l /home/shellscripts/
#ls -l /home/shellscripts/
b). 替换变量
aa.sh
#!/bin/bash
dirpath=/home/shellscripts
cmd="ls -l $dirpath | awk -F ' ' '{print \$9}'"
eval $cmd
在执行eval $cmd的时候,第一次先将$cmd用值替换,第二次将变量$cmd的值直接在shell
中以命令的形式来执行。
c). 可以执行任何值为命令组合的变量
上例中 cmd="ls -l $dirpath | awk -F ' ' '{print \$9}'",能不能直接执行 $cmd呢 ?
$cmd的值就是一个命令啊,实际执行是报错的。
在实际使用中,可以将任意组合的命令赋值给一个变量,然后在需要的位置通过eval $variable
来执行这个命令。试想如果你遇到了一个很复杂的命令组合,可能在多个地方需要执行,此时使
用eval的功能就很方便。当然,有人可能会说可以使用函数,但是函数只有在调用的时候才会生
效,且每次调用都要到内存中执行一遍,变量一旦赋值,直到变量的生命周期结束都会存在内层
中供其调用。
d). 变量替换赋值
#!/bin/bash
x=100
y=x
eval echo \$$y ---- $y就是x ,这里就是 echo $x , 就是 100
eval $y=50 ---- eval $y=50 这句话相当于一个变量赋值,$y替换成x而将50赋值给了x变量
echo $x
eval echo \$$y ---- 同上