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
  • 相关阅读:
    Dev中出现Error 0: 操作成功完成。
    找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有没有鞍点。
    oracle 日常删除多余数据
    java程序练习:输入数字转换成中文输出(金额相关)
    linux压缩和解压文件命令
    一篇文章搞定Git——Git代码管理及使用规范
    读书心得(1)-20191108
    回表查询的说明
    Java 8新特性解读
    java-try catch中return在finally之前 还是之后执行
  • 原文地址:https://www.cnblogs.com/zengkefu/p/5558776.html
Copyright © 2011-2022 走看看