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.

你可能感兴趣的:(linux,bash,运维,云计算,centos)