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. 演示:配置日志发送到syslog日志服务器

    演示目标:配置网络环境中的交换机和路由器将日志发送到syslog日志服务器. 演示环境:如下图10.54所示的演示环境. 演示背景:要求部署网络中的syslog服务器,集中的收集交换机S1和路由器R1 ...

  2. Pointers and Memory

    Stanford CS Education Library #102 一.Basic Pointers 指针主要有两个用途:使不同的代码段共享信息.方便链表(树)的处理. 指针示意图: derefer ...

  3. linux上github的简单使用

    Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理.在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中.目前,包括Rubinius ...

  4. jquery 根据后端传过来的value值,让小原点根据不同值区间去左右定位

    /** * 小圆点滑动 * @param {目标dom} barEle * @param {最小值} min * @param {最大值} max * @param {dom总长度} domLang ...

  5. VMware15.5.0安装MacOS10.15.0系统 安装步骤(下)

    VMware15.5.0安装MacOS10.15.0系统安装步骤(下)超详细! 接上文第5条如果没看过上篇的话传送门:https://www.cnblogs.com/Top-chen/p/128024 ...

  6. 《Docker从入门到跑路》之镜像和容器的基本操作

    一.获取镜像 官方提供了一个公共镜像仓库Docker Hub,默认是从这上面获取镜像的. 搜素镜像使用docker search 命令: # docker search --help Usage: d ...

  7. socket编程之时间回射服务器

    使用到的函数: // 返回值:读到的字节数,若已到文件尾,返回0:若出错,返回-1 ssize_t read(int fd, void *buf, size_t nbytes); // 返回值:若成功 ...

  8. spring cloud系列教程第一篇-介绍

    spring cloud系列教程第一篇-介绍 前言: 现在Java招聘中最常见的是会微服务开发,微服务已经在国内火了几年了,而且也成了趋势了.那么,微服务只是指spring boot吗?当然不是了,微 ...

  9. D. Count the Arrays 计数题

    D. Count the Arrays 也是一个计数题. 题目大意: 要求构造一个满足题意的数列. \(n\) 代表数列的长度 数列元素的范围 \([1,m]\) 数列必须有且仅有一对相同的数 存在一 ...

  10. leetcode_课程表(BFS、拓扑排序)

    题目描述: 你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 .在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹 ...