linux eval 变量消失,[linux 零散知识拾荒一之eval命令] 2018-09-09

有言在先

今天开始开启Linux相关零散知识的拾荒之路。鄙人是菜鸟一枚,开始接触Linux也不久,大约一个月吧。逐渐觉得大多数知识系统学习过后,对于一些零散且常用知识的记录有必要。写这个系列,我希望自己一直可以坚持下去。一方面作为学习笔记,另一方面如果方便了别人,亦是一番荣幸,有谬误之处,烦请各位不吝指出,感激不尽!

本系列文章的主要结构为:首先记录知识点作用以及应用;然后附上自己的demo;如果有必要,最后注明需要留心的注意事项。

言归正传

eval命令作用

语法:

eval cmdLine

解释:

eval会对后面的cmdLine进行两遍扫描,如果第一遍扫描后,cmdLine是个普通命令,则执行此命令;如果cmdLine中含有变量的间接引用,则保证间接引用的语义。

也就是说,eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。因此,eval命令适用于那些一次扫描无法实现其功能的变量。

即:eval 的执行经历以下两个步骤:

第一步,执行变量替换,类似与C语言的宏替代;

第二步,执行替换后的命令串。

Demo

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

3d9f1108bdea?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

执行含有带字符串的命令

demo2:回显简单变量

3d9f1108bdea?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

回显简单变量

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

如果我们知道参数个数,我们想要查看最后一个参数的内容可以使用echo直接显示,如输入 first last两个参数我们可以用echo $2 来查看最后一个参数;

但是,如果我们不知道参数个数还想查看最后一个参数内容该怎么办呢?

此时我们会想到 $$#是传给shell脚本的参数个数,但是使用echo “$$#”后显示的其实是参数个数,而使用eval echo “$$#”才显示最后一个参数的内容。

#!bin/sh

#test eval 获取传给shell的最后一个参数

echo "\$$#"

eval echo "\$$#"

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

3d9f1108bdea?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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

demo4:条件筛选

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

3d9f1108bdea?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

testfile

执行以下代码:

#!/bin/sh

while read KEY VALUE;do

eval "${KEY}=${VALUE}"

done

echo "$NAME $AGE $SEX"

3d9f1108bdea?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

条件筛选

注意事项

eval 不能获得函数处理结果。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值