linux脚本语言之shell 中的eval

本文详细介绍了Linux Shell中的eval命令,包括它的功能、语法和参数使用。通过测试用例展示了eval如何处理变量和命令,特别是在处理间接引用和字符串命令时的作用。此外,还对比了eval与倒引号 "" 和 `$()` 的区别,强调了在不同场景下选择合适的方法进行命令替换的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.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

这里写图片描述
-
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. $()中则不需要考虑\的问题,与我们平常使用的一样 \ = \

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值