码迷,mamicode.com
首页 > 系统相关 > 详细

浅谈shell—eval

时间:2016-06-12 23:41:23      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:eval、linux

一、eval的基本用法

     eval会对后面的 cmdLine 进行两遍扫描,如果第一遍扫描后,cmdLine 是个普通命令,则执行此命令;

     如果 cmdLine 中含有变量的间接引用,则保证间接引用的语义。

     1.eval 命令将会首先扫描命令行进行所有的替换,然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量,且对变量进行两次扫描。需要进行两次扫描的变量被称为复杂变量。

     2.eval 也可以用于回显简单变量,不一定是复杂变量。

     3.两次扫描。

     例如:test.txt 内容:hello shell world!

               myfile="cat test.txt"

               (1)echo $myfile         #result:cat test.txt

               (2)eval echo $myfile  #result:hello shell world!

                从(2)可以知道第一次扫描进行了变量替换,第二次扫描执行了该字符串中所包含的命令。

     4.获得最后一个参数。

       例如:set 11 22 33 44

        如果要输出最近一个参数,即44,可以使用如下命令,

        echo $4

        但是如果我们不知道有几个参数的时候,要输出最后一个参数,大家可能会想到使用 $# 来输出最后一个参数。

        如果使用命令:

        echo "\$$#"

        则得到的结果是 $4,而不是我们想要的44。

        这里涉及到一个变量间接引用的问题,我们的本意是输出 44,默认情况下,命令后忽略变量间接引用的情况。

        使用eval命令就可以达到我们的预期:

        eval echo "\$$#"

        则得到的结果为44。


二、shell 的 eval 同其他语言的区别

     shell 也提供了 eval 命令,将它的参数做为命令执行,初看会疑惑为什么 shell 要提供两种动态执行命令字串的机制,但是经过仔细分析,才发现shell的eval同其他语言有很大区别。

     1.shell 中的函数虽然可以通过return 返回,但是这里的return 相当于 exit,只能是个状态值用于测试,而不能像其它语言一样返回复杂的结果,其处理结果只能通过输出到标准输出经过 `` 和 $() 取得。

     2.shell 中的 eval

        a.不能获得函数处理结果 ,如1所说,所有命令,函数的处理结果只能通过 `` 来获得,那么其它语言中利用 eval 来获得动态生成代码执行后的输出变得不可能。

        b.eval 嵌套无意义 ,在其他语言中可以通过 eval(eval("code")) ,来执行(执行动态生成的 code 的返回),而由于shell 中 eval 将后面的 eval 命令简单当作命令字符串执行,失去了嵌套作用,嵌套被命令替换取代。


本文出自 “GREEN” 博客,请务必保留此出处http://green906.blog.51cto.com/10697569/1788442

浅谈shell—eval

标签:eval、linux

原文地址:http://green906.blog.51cto.com/10697569/1788442

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!