zoukankan      html  css  js  c++  java
  • 常用命令-eval简析

    www.2cto.com  

     
    1. 工作原理及用法  
    用法: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
  • 相关阅读:
    高级(线性)素数筛
    Dijkstra(迪杰斯特拉)算法
    简单素数筛
    【解题报告】 POJ1958 奇怪的汉诺塔(Strange Tower of Hanoi)
    4 jQuery Chatting Plugins | jQuery UI Chatbox Plugin Examples Like Facebook, Gmail
    Web User Control Collection data is not storing
    How to turn on IE9 Compatibility View programmatically in Javascript
    从Javascrip 脚本中执行.exe 文件
    HtmlEditorExtender Ajax
    GRIDVIEW模板中查找控件的方式JAVASCRIPT
  • 原文地址:https://www.cnblogs.com/zengkefu/p/5558776.html
Copyright © 2011-2022 走看看