linux脚本语言之shell 中的eval

来源:互联网 发布:ubuntu chrome 安装 编辑:程序博客网 时间:2024/04/28 05:25

.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=1echo ${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

cattextmyfile

myfile="cat text"

echomyfile

echo $myfile//结果为:cat text

eval

eval $myfile

这里写图片描述
-
4.

#!/bin/bashecho "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/bashecho `date`echo "-----------------"echo $(date)


这里写图片描述
- 反引号和$()的区别

7
test.sh

!/bin/bashecho `echo \\`echo `echo \\\\`echo $(echo \\)echo $(echo \\\\)


这里写图片描述

通过上述的测试,我们可以发现:

1.反引号齐本身就对\进行了转义,保留了其本身意思,如果我们想在反引号中起到\的特殊意义,我们必须使用2个\来进行表示。所以我们可以简单的想象成反引号中 \ = \
2. $()中则不需要考虑\的问题,与我们平常使用的一样 \ = \

原创粉丝点击