文章目录
- 一、命令介绍
 - 二、选项参数
 - 三、命令示例
 - (一)输出文件的内容
 - (二)统计当前目录下的文件总数
 - (三)输出变量的值及给变量赋值
 
一、命令介绍
功能说明:重新运算求出参数的内容。
 命令语法:eval [参数]
 命令参数:参数不限数目,彼此之间用分号分开,参数通常是一条命令行(command-line)
 补充说明:eval(evaluate) 可读取一连串的参数,然后再依参数本身的特性来执行。
eval 第 1 次扫描(解释)参数,如果参数中含有变量则替换成变量值,如果有转义符则完成转义;接着再扫描第 2 次参数,这次会依据参数本身的含义来执行,比方说,参数是一个 shell 命令,则会执行该命令。
eval 主要用在对参数的特殊处理上面的,一般的命令行,shell 处理参数就只执行一遍,像转义和变量转变;但加上 eval 后就可以对参数做两遍处理;一个 eval 只能使 shell 对参数多一次处理,因此有几个 eval 就可以多加几次,即 eval eval command-line 这样就能对参数进行三次编译,但此时应特别注意参数的转义,
二、选项参数
后面再整理了…
三、命令示例
(一)输出文件的内容
文件 test.txt 中的内容:
hello shell world!
 
声明定义变量 myfile:
[root@htlwk0001host ~]# myfile="cat test.txt" 
 
直接执行命令 echo:
[root@htlwk0001host ~]# echo $myfile
cat text.txt
 
加上 eval 后再执行:
[root@htlwk0001host ~]# eval $myfile
hello shell world!
 
说明:
 第 1 次扫码,获取变量 myfile 的值进行替换,结果就是:eval echo cat text.txt;
 第 2 次扫码,就是按 eval 后面的参数本身的含义来运行,发现 2 个命令:echo 和 cat,于是先执行 cat 得到结果:hello shell world!,再执行命令 echo 输出后面的内容到标准输出,结果就是:hello shell world!。
注意下面这个命令行:
[root@htlwk0001host ~]# eval echo $myfile
cat text.txt
 
说明:
 eval 是进行二次命令行解析,不是执行两次命令。在命令开始执行之前,命令行会先进行解析。eval echo $myfile 第一轮命令行解析,将变量替换掉,得到 eval echo cat text.txt,然后执行 eval 命令,eval 命令使得它后面的参数当成外部输入的命令行,即相当于你再次单独输入echo cat text.txt,于是再次进行命令行的解析,但这次没什么特殊符号是需要解析的,所以解析完成后得到的命令仍然是 echo cat text.txt,然后开始执行 echo 命令。如果想要得到你期望的结果,输出 hello shell world,那么应该 eval $myfile,这样第一轮变量替换之后得到 eval cat test.txt,eval 命令开始执行,于是对它的参数部分 cat test.txt 进行第二次命令行解析,但是这次没有什么特殊符号需要解析的,最终执行cat 命令。
(二)统计当前目录下的文件总数
[root@htlwk0001host test]# pipe="|"
[root@htlwk0001host test]# echo $pipe
|
[root@htlwk0001host test]# eval ls $pipe wc -l
13
 
注:
 eval 会对后面的参数(就是这串 ls $pipe wc -l)解释两次(有人说扫描两次,意思差不多吧!),第一次就是把变量 pipe 替换成对应的值,第二次才真正地执行 eval 后面的命令。
shell 第 1 次扫描命令行时,它替换出 pipe 的值 |,接着 eval 让 shell 再次扫描命令行,这时 shell 把 | 作为管道符号了,并真正地执行 eval 后面的 shell 命令。
(三)输出变量的值及给变量赋值
[root@htlwk0001host test]# x=100 
[root@htlwk0001host test]# ptrx=x
[root@htlwk0001host test]# eval echo \$$ptrx 
100
[root@htlwk0001host test]# eval $ptrx=50 
[root@htlwk0001host test]# echo $x
50
 
注:
- 第 
1次解释 eval 后面的命令串echo \$$ptrx,\$转义后得到普通的字符$,$ptrx被替换成对应的值,即x,所以经过第1次解释后得到的命令行串是echo $x,但是第 1 次 不会去eval后面的命令;第2次才真正去解释执行命令,于是输出变量x的值,即100。 - 第 
1次解释 eval 后面的命令串$ptrx=50,$ptrx被替换成对应的值,即x,得到的命令串是x=50,第2次才真正解释执行,所以就是给变量x赋值50,最后echo $x的输出结果就是50。