eval

格式:eval [argument...]

可以二次迭代参数中的引用变量,然后将参数作为命令,在shell中执行

如果是多个参数,那么变量替换之后必须符合某个命令的格式,否则eval会报错“**未找到命令”

与echo的区别:

  1. echo 对后面参数中的引用变量只能进行一次迭代
  2. echo 后面的参数是作为字符串输出到命令行,而不是作为命令在shell中执行

示例:

  • 一次迭代可以解析引用变量的嵌套

    # 引用变量的嵌套
    file="txt.txt"
    dir="~/testcase/$file"
    t="cat $dir"
    echo $t
    eval echo $t
    eval $t # 输出结果
    # $t 解析为 cat ~/testcase/txt.txt,然后作为 echo 命令的参数,输出到终端
    cat ~/testcase/txt.txt
    # 先将 $t 解析为 cat /home/lfp/testcase/txt.txt,再将 echo cat /home/lfp/testcase/txt.txt 作为命令,
    # 在shell中执行,echo 命令的作用便是将后面的参数作为字符串输出到终端
    cat /home/lfp/testcase/txt.txt
    # 先将 $t 解析为 cat /home/lfp/testcase/txt.txt,再将 cat /home/lfp/testcase/txt.txt 作为命令,在shell中执行
    test case txt file # 此为 txt.txt 文件中的内容,作为cat 命令的执行结果输出到终端
  • 二次迭代可以解析,一次迭代后,和参数中的'$',组成的,新的引用变量

    lfp@legion:~$ days=365
    lfp@legion:~$ year=days
    lfp@legion:~$ echo $year
    days
    lfp@legion:~$ echo \$$year
    $days
    # 第一次 $year 解析为 days,跟参数中的 $,组合成新的引用变量 $days,变为 eval echo $days
    # 第二次 $days 解析为365,变为 eval echo 365,消除了引用变量,于是将 echo 365 作为命令,在shell中执行
    # 替换之后的参数为 echo 365 符合echo命令格式,于是在shell中执行 echo 365 这个命令,输出 365
    lfp@legion:~$ eval echo \$$year
    365 # 参数 \$$year 被两次解析为365,eval 便将 365 作为命令,在shell中执行,但是365 不是一个命令,所以报错
    lfp@legion:~$ eval \$$year
    365:未找到命令
  • 官方例子改编

    # 定义两个变量
    lfp@legion:~$ foo=10 x=foo # 一般命令的执行,对于引用变量只解析一次
    # 下面命令的执行结果是 y=$foo
    lfp@legion:~$ y='$'$x # 先解析为 '$'foo,再赋值给变量 y
    lfp@legion:~$ echo $y
    $foo
    lfp@legion:~$ echo y='$'$x # 先解析为 y='$'foo,再作为echo命令的参数,输出到终端
    y=$foo
    lfp@legion:~$ echo $y
    $foo # eval 可以两次迭代引用变量
    lfp@legion:~$ eval echo y='$'$x
    y=10
    lfp@legion:~$ echo $y # y=10 未作为命令在shell中执行,变量 y 的值未改变
    $foo
    lfp@legion:~$ eval y='$'$x
    lfp@legion:~$ echo $y # y=10 作为命令在shell中执行,变量 y 的值被改变
    10
  • 测试3次迭代

    lfp@legion:~$ a=b
    lfp@legion:~$ b=c
    lfp@legion:~$ c=d
    lfp@legion:~$ eval echo $a
    b
    lfp@legion:~$ eval echo '$'$a
    c
    # 自己测试没有3次迭代
    lfp@legion:~$ eval echo '$''$'$a
    21947b

参考

https://unix.stackexchange.com/a/23115

http://cn.linux.vbird.org/linux_basic/Mandrake9.0/0320bash.php#eval

http://www.361way.com/shell-eval-variable/4957.html

最新文章

  1. jQuery 邮箱下拉列表自动补全
  2. [Asp.net 5] Logging-日志系统的基本架构(上)
  3. RGW 负载均衡和高可用的几个方案对比
  4. hdu 1558 线段相交+并查集
  5. 【转】SQL删除重复记录,只保留其中一条
  6. ANT-build.xml编译文件详解
  7. 【最长上升子序列】HDU 1087——Super Jumping! Jumping! Jumping!
  8. ASP.NET MVC 中使用 UEditor 富文本编辑器
  9. Cocoapods安装过程
  10. sklearn-woe/iv-乳腺癌分类器实战
  11. 开源一个CSV解析器(附设计过程 )
  12. 改写element-ui中的日期组件
  13. SQL语句(三)数据表的修改
  14. Android 手动调用 返回键
  15. DBS-Tally book(记账本)
  16. [na]office 2010 2013卸载工具
  17. iOS单选和全选
  18. Http请求get和post调用
  19. 原型 Boolean String Math Date知识点
  20. js引入方式的弹框方法2

热门文章

  1. C++基本知识总结
  2. HDU-1857 畅通工程再续
  3. Jenkins 构建 Jmeter 项目
  4. 将A页面提交的数据id传递到B页面
  5. 内存迟迟下不去,可能你就差一个GC.Collect
  6. EOS基础全家桶(十)交易Action操作
  7. pytest文档38-allure.setp添加测试用例步骤
  8. 解决json字符串转为对象时LocalDateTime异常问题
  9. jQuery中bind()与on()绑定事件的区别
  10. Spring Cloud学习 之 Spring Cloud Hystrix(使用详解)