有言在先
今天开始开启Linux相关零散知识的拾荒之路。鄙人是菜鸟一枚,开始接触Linux也不久,大约一个月吧。逐渐觉得大多数知识系统学习过后,对于一些零散且常用知识的记录有必要。写这个系列,我希望自己一直可以坚持下去。一方面作为学习笔记,另一方面如果方便了别人,亦是一番荣幸,有谬误之处,烦请各位不吝指出,感激不尽!
本系列文章的主要结构为:首先记录知识点作用以及应用;然后附上自己的demo;如果有必要,最后注明需要留心的注意事项。
言归正传
eval命令作用
- 语法:
eval cmdLine - 解释:
eval会对后面的cmdLine进行两遍扫描,如果第一遍扫描后,cmdLine是个普通命令,则执行此命令;如果cmdLine中含有变量的间接引用,则保证间接引用的语义。
也就是说,eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。因此,eval命令适用于那些一次扫描无法实现其功能的变量。
即:eval 的执行经历以下两个步骤:
第一步,执行变量替换,类似与C语言的宏替代;
第二步,执行替换后的命令串。
Demo
demo1:执行含有带字符串的命令
执行含有带字符串的命令
执行含有带字符串的命令
demo2:回显简单变量
回显简单变量
回显简单变量
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的值对应起来,从文件中读取 。
testfile
执行以下代码:
#!/bin/sh
while read KEY VALUE;do
eval "${KEY}=${VALUE}"
done <testfile
echo "$NAME $AGE $SEX"
条件筛选
条件筛选
注意事项
- eval 不能获得函数处理结果。
- eval 嵌套无意义,在其他语言中可以通过 eval(eval(“code”)) ,来执行(执行动态生成的 code 的返回),而由于shell 中 eval 将后面的 eval 命令简单当作命令字符串执行,失去了嵌套作用,嵌套被命令替换取代。