[linux 零散知识拾荒一之eval命令] 2018-09-09



有言在先

  今天开始开启Linux相关零散知识的拾荒之路。鄙人是菜鸟一枚,开始接触Linux也不久,大约一个月吧。逐渐觉得大多数知识系统学习过后,对于一些零散且常用知识的记录有必要。写这个系列,我希望自己一直可以坚持下去。一方面作为学习笔记,另一方面如果方便了别人,亦是一番荣幸,有谬误之处,烦请各位不吝指出,感激不尽!
  本系列文章的主要结构为:首先记录知识点作用以及应用;然后附上自己的demo;如果有必要,最后注明需要留心的注意事项。



言归正传


eval命令作用


  • 语法:
      eval cmdLine
  • 解释:
      eval会对后面的cmdLine进行两遍扫描,如果第一遍扫描后,cmdLine是个普通命令,则执行此命令;如果cmdLine中含有变量的间接引用,则保证间接引用的语义。
      也就是说,eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。因此,eval命令适用于那些一次扫描无法实现其功能的变量。
      即:eval 的执行经历以下两个步骤:
      第一步,执行变量替换,类似与C语言的宏替代;
      第二步,执行替换后的命令串。

Demo


demo1:执行含有带字符串的命令

[linux 零散知识拾荒一之eval命令] 2018-09-09_第1张图片
执行含有带字符串的命令


demo2:回显简单变量

[linux 零散知识拾荒一之eval命令] 2018-09-09_第2张图片
回显简单变量


demo3:eval命令还可以获取传给shell的最后一个参数

  如果我们知道参数个数,我们想要查看最后一个参数的内容可以使用echo直接显示,如输入 first last两个参数我们可以用echo $2 来查看最后一个参数;
  但是,如果我们不知道参数个数还想查看最后一个参数内容该怎么办呢?
  此时我们会想到 $$#是传给shell脚本的参数个数,但是使用echo “$$#”后显示的其实是参数个数,而使用eval echo “$$#”才显示最后一个参数的内容。

#!bin/sh
#test eval 获取传给shell的最后一个参数
echo "\$$#"
eval echo "\$$#"

执行上述代码,结果如下:


eval命令还可以获取传给shell的最后一个参数


demo4:条件筛选

  在testfile文件中写入两列数据,第一列对应KEY 、第二列为VALUE,使用eval命令将KEY与VALUE的值对应起来,从文件中读取 。

[linux 零散知识拾荒一之eval命令] 2018-09-09_第3张图片
testfile

执行以下代码:

#!/bin/sh

while read KEY VALUE;do
    eval "${KEY}=${VALUE}"
done 

条件筛选



注意事项

  • eval 不能获得函数处理结果。
  • eval 嵌套无意义,在其他语言中可以通过 eval(eval(“code”)) ,来执行(执行动态生成的 code 的返回),而由于shell 中 eval 将后面的 eval 命令简单当作命令字符串执行,失去了嵌套作用,嵌套被命令替换取代。


你可能感兴趣的:([linux 零散知识拾荒一之eval命令] 2018-09-09)