eval linux
2017-06-27 11:41:59 ChenMiao0924 阅读数 232

eval :命令替换
编写以下脚本,实现统计当前目录中文件个数。
这里写图片描述
结果如下:
这里写图片描述
报错了。这时因为没有解释出pipe变量的内容,所以会报错。
加上eval后
这里写图片描述
结果为:
这里写图片描述
达到预期效果。eval进行两次扫描,第一次扫描,将pipe变量替换为 | ,第二次扫描再执行命令行命令,这时,shell会识别 | 为管道符号,所以命令成功运行。
但是同是命令替换,反引号`和$()却没有这种效果。他们只是会将pipe替换 | ,但是shell却无法识别此时的 | 。所以结果会报错。

再举个例子说明。
有一个files文件内容为hello file
编写一个shell脚本,先用一个变量接收file的内容,再将该变量的内容显示出来。
没用eval时
这里写图片描述
结果为
这里写图片描述
没有解析cat命令。
换成eval
这里写图片描述
结果为:
这里写图片描述
总结:eval 可以替换间接的命令,并使shell识别。
反引号和$()只能替换简单命令。
ps:反引号与$()的区别

2017-07-03 17:27:56 Dakuan_chen 阅读数 164

1. eval command-line

其中commandline是在终端上键入的一条普通命令行。然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次。如:

pipe="|"

eval ls $pipe wc -l

shell1次扫描命令行时,它替换出pipe的值|,接着eval使它再次扫描命令行,这时shell把|作为管道符号了。

如果变量中包含任何需要shell直接在命令行中看到的字符(不是替换的结果),就可以使用eval。命令行结束符(;  &),Io重定向符(< >)和引号就属于对shell具有特殊意义的符号,必须直接出现在命令行中。

2. eval echo \$$# 取得最后一个参数

如:cat last

eval echo \$$#

./last one two three four

four

第一遍扫描后,shell把反斜杠去掉了。当shell再次扫描该行时,它替换了$4的值,并执行echo命令

3.以下示意如何用eval命令创建指向变量的“指针”:

x=100

ptrx=x

eval echo \$$ptrx 指向ptrx,用这里的方法可以理解b中的例子

100 打印100

eval $ptrx=50 50存到ptrx指向的变量中。

echo $x

50 打印50

2017-06-27 17:10:35 mm_hh 阅读数 143

一、eval command-line

其中command-line:表示在终端上输入的一条普通的命令行。然而当在他的前面加上 eval 时,eval会对后面的comLine进行两遍扫描,如果在第一遍扫描后comLine是一个普通命令,则执行此命令,如果comdLine中含有变量的间接引用,则需保证间接引用的语义如:

//eg1:shell脚本

pipe="|"
eval ls -al $pipe wc -l

这里写图片描述
上例讲解:shell 在第一次扫描命令行时,它替换出pipe的值 | ;接着 eval 使它再次扫描命令行,这是shell 把 | 作为管道符号了。
如果变量中包含任何需要shell直接在命令行中看到的字符(不是替换的结果),就可以使用eval。 命令行结束符(; | &),I/O重定向符(< >)和引号就属于对shell具有特殊意义的符号,必须直接出现在命令行中。

//eg2:shell脚本
set 11 22 33 44 55 66
echo $6//表示输出最后一个数66(这是在知道有多少个参数的情况下可以这样)

//如果我们并不知道有多少个参数,这时要求输出最后一个参数的值?这时就需要用到$#来输出最后一个参数
echo "\$$#"  //$6(这并不是我们想要的结果)

eval echo "\$$#"  //44(想要的结果)
  1 #!/bin/bash
  2 
  3 
  4 set 11 22 33 44 55 66 
  5 echo $6
  6 echo "\$$#"
  7 eval echo "\$$#"  

这里写图片描述

二、如何用eval命令创建指向变量的“指针”

//eg:shell脚本

  1 #!/bin/bash
  2 
  3 x=100
  4 echo "x=$x" // x=100
  5 
  6 ptrx=x
  7 eval echo $$ptrx //指向ptrx
  8 eval $ptrx=111   //将111存到ptrx指向的变量中                                                           
  9 echo "x=$x"   //x=111(x已被修改通过ptrx)

这里写图片描述
与eval功能类似的还有以下符号,请看这篇博客
Linux脚本下倒引号( ` ),与$()

2012-06-04 11:21:59 hittata 阅读数 1975
eval 就是将命令执行两次
1.第一次,执行变量替换

2.第二次,执行替换后的命令串

#!/bin/bash
g="|"
eval ls $g wc -l
#执行第一次命令串变为: ls | wc -l
#执行第二次获得结果

echo \$$#
eval echo\$$#
#执行第一次命令串为:echo $n
#再执行一次替换后的命令串

com="cat ev.sh"
echo $com
eval $com
#执行第一次命令变为 cat ev.sh
#执行第二次命令为查看ev.sh的内容


2011-11-24 00:21:11 xjtuse_mal 阅读数 503

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

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

NAME=ZONE

eval echo $NAME等价于echo $NAME

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.获得最后一个参数

echo "Last argument is $(eval echo \$$#)"

echo "Last argument is $(eval echo $#)"


linux eval

阅读数 4521

linux shell的eval

阅读数 1046

linux eval命令

阅读数 49

Linux eval命令

阅读数 15

没有更多推荐了,返回首页