eval

格式:eval [argument...]

可以二次迭代参数中的引用变量,然后将参数作为命令,在shell中执行

如果是多个参数,那么变量替换之后必须符合某个命令的格式,否则eval会报错“**未找到命令”

与echo的区别:

  1. echo 对后面参数中的引用变量只能进行一次迭代
  2. echo 后面的参数是作为字符串输出到命令行,而不是作为命令在shell中执行

示例:

  • 一次迭代可以解析引用变量的嵌套

    # 引用变量的嵌套
    file="txt.txt"
    dir="~/testcase/$file"
    t="cat $dir"
    echo $t
    eval echo $t
    eval $t # 输出结果
    # $t 解析为 cat ~/testcase/txt.txt,然后作为 echo 命令的参数,输出到终端
    cat ~/testcase/txt.txt
    # 先将 $t 解析为 cat /home/lfp/testcase/txt.txt,再将 echo cat /home/lfp/testcase/txt.txt 作为命令,
    # 在shell中执行,echo 命令的作用便是将后面的参数作为字符串输出到终端
    cat /home/lfp/testcase/txt.txt
    # 先将 $t 解析为 cat /home/lfp/testcase/txt.txt,再将 cat /home/lfp/testcase/txt.txt 作为命令,在shell中执行
    test case txt file # 此为 txt.txt 文件中的内容,作为cat 命令的执行结果输出到终端
  • 二次迭代可以解析,一次迭代后,和参数中的'$',组成的,新的引用变量

    lfp@legion:~$ days=365
    lfp@legion:~$ year=days
    lfp@legion:~$ echo $year
    days
    lfp@legion:~$ echo \$$year
    $days
    # 第一次 $year 解析为 days,跟参数中的 $,组合成新的引用变量 $days,变为 eval echo $days
    # 第二次 $days 解析为365,变为 eval echo 365,消除了引用变量,于是将 echo 365 作为命令,在shell中执行
    # 替换之后的参数为 echo 365 符合echo命令格式,于是在shell中执行 echo 365 这个命令,输出 365
    lfp@legion:~$ eval echo \$$year
    365 # 参数 \$$year 被两次解析为365,eval 便将 365 作为命令,在shell中执行,但是365 不是一个命令,所以报错
    lfp@legion:~$ eval \$$year
    365:未找到命令
  • 官方例子改编

    # 定义两个变量
    lfp@legion:~$ foo=10 x=foo # 一般命令的执行,对于引用变量只解析一次
    # 下面命令的执行结果是 y=$foo
    lfp@legion:~$ y='$'$x # 先解析为 '$'foo,再赋值给变量 y
    lfp@legion:~$ echo $y
    $foo
    lfp@legion:~$ echo y='$'$x # 先解析为 y='$'foo,再作为echo命令的参数,输出到终端
    y=$foo
    lfp@legion:~$ echo $y
    $foo # eval 可以两次迭代引用变量
    lfp@legion:~$ eval echo y='$'$x
    y=10
    lfp@legion:~$ echo $y # y=10 未作为命令在shell中执行,变量 y 的值未改变
    $foo
    lfp@legion:~$ eval y='$'$x
    lfp@legion:~$ echo $y # y=10 作为命令在shell中执行,变量 y 的值被改变
    10
  • 测试3次迭代

    lfp@legion:~$ a=b
    lfp@legion:~$ b=c
    lfp@legion:~$ c=d
    lfp@legion:~$ eval echo $a
    b
    lfp@legion:~$ eval echo '$'$a
    c
    # 自己测试没有3次迭代
    lfp@legion:~$ eval echo '$''$'$a
    21947b

参考

https://unix.stackexchange.com/a/23115

http://cn.linux.vbird.org/linux_basic/Mandrake9.0/0320bash.php#eval

http://www.361way.com/shell-eval-variable/4957.html

对 eval 命令的理解的更多相关文章

  1. 理解shell的eval命令

    看以下两条命令:[zhangsan@XEN /sys]$ a="ls";b="\$a";c="$b";"$c"Hey! ...

  2. 【转】exec xargs的区别 另附eval命令介绍

    -exec:  对符合条件的文件执行所给的Linux 命令,执行exec后面的shell脚本.脚本中,{}表示命令的参数即为所找到的文件,以:表示comman命令的结束.\是转义符,因为分号在命令中还 ...

  3. shell eval命令

    1. eval command-line 其中command-line是在终端上键入的一条普通命令行.然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次.如: pipe=&qu ...

  4. Linux命令行–理解Linux文件权限(转)

    6.1.1 /etc/passwd文件 /etc/passwd:包含系统用户账户列表以及每个用户的基本配置信息 每个条目有七个字段,每个字段用冒号隔开 登录用户名 用户密码 用户账户的UID 用户账户 ...

  5. linux eval命令

    eval 功能说明:重新运算求出参数的内容.语 法:eval [参数]补充说明:eval可读取一连串的参数,然后再依参数本身的特性来执行.参 数:参数不限数目,彼此之间用分号分开. 1.eval命令将 ...

  6. Redisson使用起来很方便,但是需要redis环境支持eval命令

    Redisson使用起来很方便,但是需要redis环境支持eval命令,否则一切都是悲剧,比如me.结果还是要用RedisCommands去写一套.例子就如下,获得一个RLock锁对象,然后tryLo ...

  7. shell中eval命令妙用——变量嵌套替换

    eval命令妙用--变量嵌套替换 eval命令在Linux下的应用非常广泛,在写脚本的时候遇到一个变量嵌套的问题,用eval迎刃而解,略试不爽啊. var1="hello" i=1 ...

  8. shell解析命令行的过程以及eval命令

    本文说明的是一条linux命令在执行时大致要经过哪些过程?以及这些过程的大致顺序. 1.1 shell解析命令行 shell读取和执行命令时的大致操作过程如下图: 以执行以下命令为例: echo -e ...

  9. Linux里的eval命令

      这个命令之前没有用过,在网上查了一下资料,觉得人家写的很好,所以复制过来了. 标题:linux命令eval的用法 链接:http://blog.chinaunix.net/uid-21411227 ...

随机推荐

  1. 网速慢?NO可能是路由器的原因?

    先排除DNS的问题:看这个! 为什么我家300M的网,而且wifi信号满格,还是网速很慢? 这时候不排除是路由器的原因! 第一步首先我们要知道自己家的网关IP: 什么是网关? 网关(Gateway)又 ...

  2. 2019-2020 ICPC, Asia Jakarta Regional Contest C. Even Path(思维)

    Pathfinding is a task of finding a route between two points. It often appears in many problems. For ...

  3. RobotFrameWork 自动化环境搭建(基于 python3.6)

    一.需要安装的工具目录 安装 python3.6.0 我这里采用的是 python3.6 (目前慢慢市场在推广 python3.0 版本了) 安装 wxPython(Python 非常有名的一个GUI ...

  4. U盘安装Proxmox VE(二)

    转自我的个人博客<U盘安装Proxmox VE(二)> 上一篇<U盘安装Proxmox VE(一)>制作好启动盘后,插入U盘,设置bios从U盘启动,开始安装pve. 一.安装 ...

  5. C# 基础知识系列- 17 小工具优化

    0. 前言 不知道有没有动手能力强的小伙伴照着上一篇的内容写过程序呢?如果有的话,应该会在使用的时候发现以下几个问题: 每次启动都需要经过漫长的时间去遍历磁盘里的文件目录 因为数据是用的字典保存的,所 ...

  6. spring 事务管理配置

    本篇文章只涉及spring事务的配置,不进行事务的介绍. spring通过PlatformTransactionManager接口作为事务管理器来进行事务的管理,它本身并不进行事务的创建以及相关操作, ...

  7. 写了shell脚本想一键启动三台虚拟机的Zookeeper,却不知道为啥总是启动不了

    首先,一键启动的shell脚本是这样的 #! /bin/bash case $1 in "start"){ for i in node01 node02 node03 do ssh ...

  8. Day_09【常用API】扩展案例4_将字符串变为字符数组,并将大写字母改为小写,首尾内容不同互换,并将索引为偶数的元素替换

    分析以下需求,并用代码实现 1.键盘录入一个字符串 2.将该字符串变成字符数组(不能使用toCharArray()方法) 3.将字符数组中的所有大写字母变成小写字母(不能使用toLowerCase() ...

  9. Linux内核驱动学习(三)字符型设备驱动之初体验

    Linux字符型设备驱动之初体验 文章目录 Linux字符型设备驱动之初体验 前言 框架 字符型设备 程序实现 cdev kobj owner file_operations dev_t 设备注册过程 ...

  10. 老板:kill -9 的原理都不知道就敢去线上执行?明天不用来了!

    GitHub 14.5k Star 的Java工程师成神之路,开放阅读了! 相信很多程序员对于Linux系统都不陌生,即使自己的日常开发机器不是Linux,那么线上服务器也大部分都是的,所以,掌握常用 ...