linux脚本语言之shell 中的eval

.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

cattextmyfile

myfile="cat text"

echomyfile

echo $myfile
//结果为:cat text

eval

eval $myfile

linux脚本语言之shell 中的eval_第1张图片
-
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使
echo 4 使 #来输出最后一个参数,
如果使用命令:
echo ” \ $$#”
则得到的结果是 $4,而不是我们想要的44。这里涉及到一个变量间接引用的问题,我们的本意是输出 $4,默认情况下,命令后忽略变量间接引用的情况。
这时候,就可以使用eval命令.
eval echo “\$$#”
得到的结果为44

.shell 中的倒引号 “ eval 和 $() 的区别

倒引号括起来的是一条命令, shell 应该先执行该命令,然后将输出结果立刻代换到当前命令行中,命令代换也可以用$()

  • 以下情况倒引号和 $()可以互换

    6
    test.sh

!/bin/bash
echo `date`
echo "-----------------"
echo $(date)


linux脚本语言之shell 中的eval_第2张图片
- 反引号和$()的区别

7
test.sh

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


linux脚本语言之shell 中的eval_第3张图片

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

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

你可能感兴趣的:(linux,shell,eval)