Linux eval将一个字符串作为命令执行

eval用来在执行命令时作二次解析:主要是每次执行一个shell命令它会先检察一次,看到有$标志就会把值替换一次,然后再执行一遍。eval不会唤起起另一个shell来执行,而是在本身这个shell内多解析一次,所以替换的结果可以保留下来使用。
shell 中的函数虽然可以通过return 返回,但是这里的return 相当于 exit,只能是个状态值用于测试,而不能像其它语言一样返回复杂的结果,其处理结果只能通过输出到标准输出经过 ``,$()取得~

eval 属 Shell 内建命令,可以读取一连串的参数,然后通过连接参数构造命令。使用空格分隔每个参数,构造的命令应由 Shell 读取和执行。
eval 会对后面的命令进行两遍扫描。如果第一遍扫描后,命令是个普通命令,则执行此命令;如果命令中含有变量的间接引用,则保证间接引用的语义。也就是说,eval 命令将会首先扫描命令行进行所有的置换,然后再执行该命令。因此,eval命令适用于那些一次扫描无法实现其功能的变量。
eval 执行以下两个步骤:
第一步执行变量替换,类似与C语言的宏替代;
第二步执行替换后的命令串。

命令格式

eval [argument …]

功能描述:通过将给定的参数以一个空格为分隔符连接在一起构造出一条命令。构造出的命令会被 shell 读取并执行。
退出状态:eval的返回值是其后面的命令退出状态。如果没有参数,或者只有 null 参数,eval 将会返回退出状态(exit status)0;否则,它会返回 构造出的命令的 退出状态。

举例

[root@master data]# qq="cat 1.txt"
[root@master data]# echo $qq
cat 1.txt
[root@master data]# eval $qq					//回显复杂变量
111
[root@master data]# eval echo $qq				//回显简单变量
cat 1.txt

将date和hwclock命令连接在一起成为一个单一的命令来执行

[root@master ~]# eval date;hwclock
Sun Apr 16 20:20:14 CST 2023
Sun 16 Apr 2023 08:20:15 PM CST  -0.568232 seconds

eval命令还可以获取传给shell的最后一个参数:
如果我们知道参数个数,我们想要查看最后一个参数的内容可以使用echo直接显示,如输入 first last两个参数我们可以用echo $2 来查看最后一个参数;
但是,如果我们不知道参数个数还想查看最后一个参数内容该怎么办呢?这是我们就想到使用 $$#为传给shell脚本的参数个数,但是上例中echo "$$#"后显示的其实是参数个数,而使用eval echo "$$#"才显示最后一个参数的内容。

[root@master data]# cat a.sh 
#!/bin/bash
echo "$$#"
echo "\$$#"
eval echo  "\$$#"
[root@master data]# ./a.sh 1 2 3
108227#
$3
3
[root@master data]#  eval ${KEY}=${VALUE}   	//第一列对应KEY 、第二列为VALUE,使用eval命令将KEY与VALUE的值对应起来

Born without cone soil, often four seas heart.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星光落入你灰蒙蒙的眼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值