浅谈shell—eval

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈shell—eval相关的知识,希望对你有一定的参考价值。

一、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的主要内容,如果未能解决你的问题,请参考以下文章

浅谈JSON.parse()JSON.stringify()和eval()的作用

浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释

浅谈Linux下shell的入门与基础

linux命令:浅谈shell中如何进行算术运算

浅谈Linux下的shell--BASH

浅谈JS的作用域链