一.关于eval
功能说明:eval的作用是再次执行命令行处理,也就是说,对一个命令行,执行两次命令行处理
语法:eval[参数]
补充:eval可以读取一连串的参数,然后再依照参数本身的特性来执行
参数:参数不限数目,彼此之间用分号隔开。
二.测试用例
- eval命令可以用于回显简单变量,不一定是复杂变量
例1.
[neau@mail ~]$ NAME=VALUEBANK
[neau@mail ~]$ eval echo $NAME
//结果为:VALUEBANK
[neau@mail ~]$ echo $NAME
//结果为:VALUEBANK
- 对变量第二次扫描
例2.
v1="francs"
v2="fpZhou"
c=1
echo ${c}
vname=v$c
echo ${vname}
eval vvv="$"$vname
echo ${vvv}
结果图:
总结:
evalcmdLine
eval会对后面的 cmdLine 进行两遍扫描,如果第一遍扫描后 cmdLine 是个普通命令,则执行此命令;
如果 cmdLine 中含有变量的间接引用,则保证间接引用的语义。
- 执行含有字符串的命令
例3.
首先创建一个名为test的小文件如下:
[corrinr@localhost myscript]$ //结果为:vi text
[corrinr@localhost myscript]$ ls
//结果为:text
[corrinr@localhost myscript]$ cat text
//结果为:how are you?
//结果为:I am fine,thanks
接下来将cattext赋给变量myfile
myfile="cat text"
然后用echo命令则无法将myfile中的消息打印出来
echo $myfile
//结果为:cat text
此时用eval则可以
eval $myfile
- 命令还可以用来显示出传递给脚本的最后一个参数
例4.
#!/bin/bash
echo "Total of the arguments passed $#"
echo "The process Id is $$"
echo "Last argument is "$(eval echo \$$#)""
结果图:
在上面的脚本中, eval命令首先把 $$#
解析为当前shell的参数个数,然后在第二次扫描时得出最后一个参数。
例5.
set11223344
如果要输出最近一个参数,即44,可以使用如下命令,
echo4但是如果我们不知道有几个参数的时候,要输出最后一个参数,大家可能会想到使用#来输出最后一个参数,
如果使用命令:
echo ” \ $$#”
则得到的结果是 $4,而不是我们想要的44。这里涉及到一个变量间接引用的问题,我们的本意是输出 $4,默认情况下,命令后忽略变量间接引用的情况。
这时候,就可以使用eval命令.
eval echo “\$$#”
得到的结果为44
三.shell中的倒引号 “eval和 $() 的区别
倒引号括起来的是一条命令,shell应该先执行该命令,然后将输出结果立刻代换到当前命令行中,命令代换也可以用$()
以下情况倒引号和 $()可以互换
例6
写如下代码在test.sh中:
!/bin/bash
echo `date`
echo "-----------------"
echo $(date)
结果如下:
- 反引号和$()的区别
例7
写如下代码在test.sh中:
!/bin/bash
echo `echo \\`
echo `echo \\\\`
echo $(echo \\)
echo $(echo \\\\)
结果如下
通过上述的测试,我们可以发现:
1.反引号齐本身就对\进行了转义,保留了其本身意思,如果我们想在反引号中起到\的特殊意义,我们必须使用2个\来进行表示。所以我们可以简单的想象成反引号中 \ = \
2. $()中则不需要考虑\的问题,与我们平常使用的一样 \ = \