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
  • 相关阅读:
    写时复制集合 —— CopyOnWriteArrayList 源码原理阅读笔记
    初步整合vue-element-admin和GitDataV两个Vue开源框架方案实现大数据可视化
    IOS苹果登录sign in with apple后端校验
    IOS审核被拒:IOS苹果授权登录(Sign in with Apple)/Apple登录/苹果登录集成教程
    ios安装自定义基座失败问题
    IOS APP上架App Store及提交审核详细教程
    IOS APP报错:SyntaxError: Invalid regular expression: invalid group specifier name __ERROR
    Apple Pay苹果支付IOS in-App Purchase内购项目服务端校验
    浅析浏览器是如何工作的(一):V8引擎、JIT机制、JS代码解释执行与编译执行
    ApplePay苹果支付内购项目配置及代码实现及沙箱测试
  • 原文地址:https://www.cnblogs.com/zengkefu/p/5558776.html
Copyright © 2011-2022 走看看