shell中的eval

eval语法

eval arg1 arg2 ...

eval的作用就是将后面的参数arg1 arg2等等当成一个pipeline,然后重新执行shell处理pipeline的流程(有关pipeline,参看http://www.cnblogs.com/chaoguo1234/p/5724321.html)

假设有如下脚本语句:

var="ls | more"
$var

上面的程序本意是列举当前目录的文件,然后使用more展示结果,但是实际执行情况会报错:

ls:can‘t access |:No Such file or directory

ls:can‘t access more:No Such file or directory

原因就是将$var进行命令替换之后,shell就进行命令查找,此时查找到命令是ls,后面的|和more都当成ls的参数,而当前目录中没有名为|和more的文件和目录,所以回报错。看一下shell处理命令的流程就清除了:

从上图可以看到,当执行完$var的变量扩展后,shell就要进行command查找。

解决的方式就是使用eval命令:

var="ls | more"
eval $var

进行完$var的变量替换之后,实际成为eval ls | more,然后根据eval的语法,shell会将ls | more当成一个pipeline,重新从上图中的第一步开始执行。

时间: 2024-12-20 15:35:37

shell中的eval的相关文章

shell中的eval学习与应用

一.bash命令处理的12个步骤: 1.将命令行分成由固定元字符集分隔的记号: SPACE, TAB, NEWLINE, ; , (, ),<, >, |,& 记号类型包括单词,关键字,I/O重定向符和分号.2.检测每个命令的第一个记号,查看是否为不带引号或反斜线的关键字. 如果是一个开放的关键字,如if和其他控制结构起始字符串,function,{或(,则命令实际上为一复合命令.shell在内部对复合命令进行处理,读取下一个命令,并重复这一过程.如果关键字不是复合命令起始字符串(如t

shell中的eval命令

在shell的学习中,我们会遇到这两种符号:反引号(` `)和$(),那么它们之间有什么区别和联系呢? 我们都知道在bash中,反引号和$()都是用来做命令替换的,命令替换就是用来重组命令行,先完成引号里面的命令,然后将其结果替换出来,再重组成新的命令行.也就是在执行一条命令时,会现将其中的` `,或者是$()中的语句当做命令执行一遍,再将结果加入到原命令中重新执行,例如: 从上面我们可以看到,当我们echo反引号里面的ls命令时,和我们直接执行ls命令是一样的,也就正应里我们前面说的,也就是在

shell中的`和$()、eval、crontab

一.`和$()的区别 反引号本身就对\进行了转义,保留了本身意思,如果我们想在反引号中起到\的特殊意义,我们必须使用2个\来进行表示. 反引号中: \\ = \ $()中:\ = \ 注意:反引号是老的用法,$()是新的用法,不管是在学习测试中,还是在实际工作中,$()的用法都是被推荐的. 二.eval命令 eval会对后面的命令进行两遍扫描,如果第一遍扫描后,命令是个普通命令,则执行此命令:如果命令中含有变量的间接引用,则保证间接引用的语义. 例如有一个文件test1,里面的内容是"this

shell中的变量与eval(转)

原文链接:http://www.361way.com/shell-eval-variable/4957.html shell 中经常会用到变量的嵌套的情况.比如,单个或多个变量的值作为变量名,再对该变量名取$获取其内部的变量的情况,这种脚本写起来很难搞,还好有eval 命令方便我们处理这种情况.便于理解,先来一个示例: #!/bin/bash a='my' b='site' my_site='my site www.361way.com' echo a_b is "$a"_"

POSIX中shell下的eval

在posix中shell环境下eval是用来取出字符串当参数选项来用的,效果和"`"是一样的,这在平时写大量引用比较复杂的脚本时十分有用.简单的用bash来说,平时使用的指令都是被分割成token来处理,那么如果是通过管道(|)或者是大量引用的时候,往往因为冗余的指令导致参数展开错误,那么就需要使用到eval,这里举一个简单的例子: #!/bin/bash args="ls -al" echo "args is :$args" eval $arg

shell中eval的使用问题

转载:http://www.blogjava.net/jasmine214--love/archive/2010/11/26/339106.html 本文将会讲解一些linux中命令的使用与技巧希望对新手给予帮助 一 eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令.该命令适用于那些一次扫描无法实现其功能的变量.该命令对变量进行两次扫描.这些需要进行两次扫描的变量有时被称为复杂变量.不过这些变量本身并不复杂. 1 eval命令也可以用于回显简单变量,不一定是复杂变量 [[email

shell脚本中的eval

eval的作用是再次执行命令行处理,也就是说,对一个命令行,执行两次命令行处理. 1.例子1:用eval技巧实现shell的控制结构for 用eval技巧实现shell的控制结构for. [[email protected] root]# cat myscript1#!/bin/shevalit(){       if [ $cnt = 1 ];then               eval [email protected]               return       else   

二、Shell中的变量

变量是任何程序或脚本的重要组成部分.变量为程序或脚本访问内存中的可被修改的一块数据提供了简单的方式.Linux Shell中的变量可以被指定为任意的数据类型.Shell中有两种变量的类型:系统变量(环境变量)和用户自定义的变量(本地变量或Shell变量). 环境变量:作用域为当前shell进程及其子进程:环境变量一般均为大写.常用的环境变量有: 系统变量 含义 BASH_VERSION 保存bash实例的版本 DISPLAY 设置X display名字 EDITOR 设置默认的文本编辑器 HIS

shell 中的常用技巧

本文收集了一堆的shell脚本技巧,主要方便自己查阅,技巧出自脚本之家中的博客,自己也增加了实现目的的其他方法,方便以后自己查阅: 0. shell 调试 代码如下: sh -x somefile.sh 在somefile.sh 文件里加上set+x set-x1. 用 && || 简化if else 代码如下: gzip -t a.tar.gz if [[ 0 == $? ]]; then     echo "good zip" else     echo "