linux命令eval的用法

1. eval command-lineshell

其中commandline是在终端上键入的一条普通命令行。然而当在它前面放上eval时,其结果是shell在执行命令行以前扫描它两次。如:网络

pipe="|"ide

eval ls $pipe wc -lspa

shell1次扫描命令行时,它替换出pipe的值|,接着eval使它再次扫描命令行,这时shell把|做为管道符号了。命令行

若是变量中包含任何须要shell直接在命令行中看到的字符(不是替换的结果),就可使用eval。命令行结束符(; &),Io重定向符(< >)和引号就属于对shell具备特殊意义的符号,必须直接出如今命令行中。指针

2. eval echo \$$# 取得最后一个参数three

如:cat lastip

eval echo \$$#字符串

./last one two three fourget

four

第一遍扫描后,shell把反斜杠去掉了。当shell再次扫描该行时,它替换了$4的值,并执行echo命令

3.如下示意如何用eval命令建立指向变量的“指针”:

x=100

ptrx=x

eval echo \$$ptrx 指向ptrx,用这里的方法能够理解b中的例子

100 打印100

eval $ptrx=50 50存到ptrx指向的变量中。

echo $x

50 打印50



----------------------------------------------------------------------------------------

经常使用命令-eval简析
1. 工做原理及用法  www.2cto.com  
用法:eval command-line
原理:eval主要用在对参数的特殊处理上面的,通常的命令行,shell处理参数就只执行一遍,像转义和变量转变;但加上eval后就能够对参数经行两遍处理;网上有说是对command-line处理两遍,我认为是不合理的。一个eval只能使shell对参数多一次处理,所以有几个eval就能够多加几回,即eval eval command-line 这样就能对参数进行三次编译,但此时应特别注意参数的转义,下面有例子说明。
eval命令会计算(evalue)它的参数,这些参数做为表达式计算后从新组合为一个字符串,而后做为一个命令被执行。
eval最多见的用法是将动态生成的命令行计算并执行。例如:
$ name=woodie
$ cmd="echo Helllo $name\! "
$ eval $cmd
Hello woodie!
2. 举例讲解
例一:(网络 下载
pipe="|"
eval ls $pipe wc -l
shell第1次扫描命令行时,它替换出pipe的值|,接着eval使它再次扫描命令行,这时shell把|做为管道符号了。
若是变量中包含任何须要shell直接在命令行中看到的字符(不是替换的结果),就可使用eval。命令行结束符(; | &),I/o重定向符(< >)和引号就属于对
shell具备特殊意义的符号,必须直接出如今命令行中。
x=100
ptrx=x
eval echo \$$ptrx 指向ptrx,用这里的方法能够理解b中的例子
100 打印100
eval $ptrx=50 将50存到ptrx指向的变量中。
echo $x
50 打印50
例二:
root@localhost:~/test#set tao shou kun
root@localhost:~/test#echo \$$#
$3
root@localhost:~/test#eval echo \$$#
kun
root@localhost:~/test#
例三:(对三重的支持)
root@localhost:~/test#aabbcc=alibaba
root@localhost:~/test#a=aa
root@localhost:~/test#b=bb
root@localhost:~/test#c=cc
root@localhost:~/test#alibaba="hello world"
root@localhost:~/test#eval echo \$\$$a$b$c
11990aabbcc
root@localhost:~/test#eval echo \\$\$$a$b$c
$alibaba
root@localhost:~/test#eval eval echo \$\$$a$b$c
11990aabbcc
root@localhost:~/test#eval eval echo \\$\$$a$b$c
hello world
注意这里的参数转义,第一遍处理后参数应该是:\$$aabbcc,第二次是:$alibaba,第三次就正好是:hello world。
附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
相关文章
相关标签/搜索