对 eval 命令的理解
eval
格式:eval [argument...]
可以二次迭代参数中的引用变量,然后将参数作为命令,在shell中执行
如果是多个参数,那么变量替换之后必须符合某个命令的格式,否则eval会报错“**未找到命令”
与echo的区别:
- echo 对后面参数中的引用变量只能进行一次迭代
- 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
对 eval 命令的理解的更多相关文章
- 理解shell的eval命令
看以下两条命令:[zhangsan@XEN /sys]$ a="ls";b="\$a";c="$b";"$c"Hey! ...
- 【转】exec xargs的区别 另附eval命令介绍
-exec: 对符合条件的文件执行所给的Linux 命令,执行exec后面的shell脚本.脚本中,{}表示命令的参数即为所找到的文件,以:表示comman命令的结束.\是转义符,因为分号在命令中还 ...
- shell eval命令
1. eval command-line 其中command-line是在终端上键入的一条普通命令行.然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次.如: pipe=&qu ...
- Linux命令行–理解Linux文件权限(转)
6.1.1 /etc/passwd文件 /etc/passwd:包含系统用户账户列表以及每个用户的基本配置信息 每个条目有七个字段,每个字段用冒号隔开 登录用户名 用户密码 用户账户的UID 用户账户 ...
- linux eval命令
eval 功能说明:重新运算求出参数的内容.语 法:eval [参数]补充说明:eval可读取一连串的参数,然后再依参数本身的特性来执行.参 数:参数不限数目,彼此之间用分号分开. 1.eval命令将 ...
- Redisson使用起来很方便,但是需要redis环境支持eval命令
Redisson使用起来很方便,但是需要redis环境支持eval命令,否则一切都是悲剧,比如me.结果还是要用RedisCommands去写一套.例子就如下,获得一个RLock锁对象,然后tryLo ...
- shell中eval命令妙用——变量嵌套替换
eval命令妙用--变量嵌套替换 eval命令在Linux下的应用非常广泛,在写脚本的时候遇到一个变量嵌套的问题,用eval迎刃而解,略试不爽啊. var1="hello" i=1 ...
- shell解析命令行的过程以及eval命令
本文说明的是一条linux命令在执行时大致要经过哪些过程?以及这些过程的大致顺序. 1.1 shell解析命令行 shell读取和执行命令时的大致操作过程如下图: 以执行以下命令为例: echo -e ...
- Linux里的eval命令
这个命令之前没有用过,在网上查了一下资料,觉得人家写的很好,所以复制过来了. 标题:linux命令eval的用法 链接:http://blog.chinaunix.net/uid-21411227 ...
随机推荐
- 网速慢?NO可能是路由器的原因?
先排除DNS的问题:看这个! 为什么我家300M的网,而且wifi信号满格,还是网速很慢? 这时候不排除是路由器的原因! 第一步首先我们要知道自己家的网关IP: 什么是网关? 网关(Gateway)又 ...
- 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 ...
- RobotFrameWork 自动化环境搭建(基于 python3.6)
一.需要安装的工具目录 安装 python3.6.0 我这里采用的是 python3.6 (目前慢慢市场在推广 python3.0 版本了) 安装 wxPython(Python 非常有名的一个GUI ...
- U盘安装Proxmox VE(二)
转自我的个人博客<U盘安装Proxmox VE(二)> 上一篇<U盘安装Proxmox VE(一)>制作好启动盘后,插入U盘,设置bios从U盘启动,开始安装pve. 一.安装 ...
- C# 基础知识系列- 17 小工具优化
0. 前言 不知道有没有动手能力强的小伙伴照着上一篇的内容写过程序呢?如果有的话,应该会在使用的时候发现以下几个问题: 每次启动都需要经过漫长的时间去遍历磁盘里的文件目录 因为数据是用的字典保存的,所 ...
- spring 事务管理配置
本篇文章只涉及spring事务的配置,不进行事务的介绍. spring通过PlatformTransactionManager接口作为事务管理器来进行事务的管理,它本身并不进行事务的创建以及相关操作, ...
- 写了shell脚本想一键启动三台虚拟机的Zookeeper,却不知道为啥总是启动不了
首先,一键启动的shell脚本是这样的 #! /bin/bash case $1 in "start"){ for i in node01 node02 node03 do ssh ...
- Day_09【常用API】扩展案例4_将字符串变为字符数组,并将大写字母改为小写,首尾内容不同互换,并将索引为偶数的元素替换
分析以下需求,并用代码实现 1.键盘录入一个字符串 2.将该字符串变成字符数组(不能使用toCharArray()方法) 3.将字符数组中的所有大写字母变成小写字母(不能使用toLowerCase() ...
- Linux内核驱动学习(三)字符型设备驱动之初体验
Linux字符型设备驱动之初体验 文章目录 Linux字符型设备驱动之初体验 前言 框架 字符型设备 程序实现 cdev kobj owner file_operations dev_t 设备注册过程 ...
- 老板:kill -9 的原理都不知道就敢去线上执行?明天不用来了!
GitHub 14.5k Star 的Java工程师成神之路,开放阅读了! 相信很多程序员对于Linux系统都不陌生,即使自己的日常开发机器不是Linux,那么线上服务器也大部分都是的,所以,掌握常用 ...