文章目录

  • 一、命令介绍
  • 二、选项参数
  • 三、命令示例
    • (一)输出文件的内容
    • (二)统计当前目录下的文件总数
    • (三)输出变量的值及给变量赋值

一、命令介绍

功能说明:重新运算求出参数的内容。
命令语法:eval [参数]
命令参数:参数不限数目,彼此之间用分号分开,参数通常是一条命令行(command-line)
补充说明:eval(evaluate) 可读取一连串的参数,然后再依参数本身的特性来执行。

eval 第 1 次扫描(解释)参数,如果参数中含有变量则替换成变量值,如果有转义符则完成转义;接着再扫描第 2 次参数,这次会依据参数本身的含义来执行,比方说,参数是一个 shell 命令,则会执行该命令。

eval 主要用在对参数的特殊处理上面的,一般的命令行,shell 处理参数就只执行一遍,像转义和变量转变;但加上 eval 后就可以对参数做两遍处理;一个 eval 只能使 shell 对参数多一次处理,因此有几个 eval 就可以多加几次,即 eval eval command-line 这样就能对参数进行三次编译,但此时应特别注意参数的转义,

二、选项参数

后面再整理了…

三、命令示例

(一)输出文件的内容

文件 test.txt 中的内容:

hello shell world!

声明定义变量 myfile:

[root@htlwk0001host ~]# myfile="cat test.txt"

直接执行命令 echo:

[root@htlwk0001host ~]# echo $myfile
cat text.txt

加上 eval 后再执行:

[root@htlwk0001host ~]# eval $myfile
hello shell world!

说明:
第 1 次扫码,获取变量 myfile 的值进行替换,结果就是:eval echo cat text.txt
第 2 次扫码,就是按 eval 后面的参数本身的含义来运行,发现 2 个命令:echocat,于是先执行 cat 得到结果:hello shell world!,再执行命令 echo 输出后面的内容到标准输出,结果就是:hello shell world!

注意下面这个命令行:

[root@htlwk0001host ~]# eval echo $myfile
cat text.txt

说明:
eval 是进行二次命令行解析,不是执行两次命令。在命令开始执行之前,命令行会先进行解析。eval echo $myfile 第一轮命令行解析,将变量替换掉,得到 eval echo cat text.txt,然后执行 eval 命令,eval 命令使得它后面的参数当成外部输入的命令行,即相当于你再次单独输入echo cat text.txt,于是再次进行命令行的解析,但这次没什么特殊符号是需要解析的,所以解析完成后得到的命令仍然是 echo cat text.txt,然后开始执行 echo 命令。如果想要得到你期望的结果,输出 hello shell world,那么应该 eval $myfile,这样第一轮变量替换之后得到 eval cat test.txteval 命令开始执行,于是对它的参数部分 cat test.txt 进行第二次命令行解析,但是这次没有什么特殊符号需要解析的,最终执行cat 命令。

(二)统计当前目录下的文件总数

[root@htlwk0001host test]# pipe="|"
[root@htlwk0001host test]# echo $pipe
|
[root@htlwk0001host test]# eval ls $pipe wc -l
13

注:
eval 会对后面的参数(就是这串 ls $pipe wc -l)解释两次(有人说扫描两次,意思差不多吧!),第一次就是把变量 pipe 替换成对应的值,第二次才真正地执行 eval 后面的命令。

shell1 次扫描命令行时,它替换出 pipe 的值 |,接着 eval 让 shell 再次扫描命令行,这时 shell| 作为管道符号了,并真正地执行 eval 后面的 shell 命令。

(三)输出变量的值及给变量赋值

[root@htlwk0001host test]# x=100
[root@htlwk0001host test]# ptrx=x
[root@htlwk0001host test]# eval echo \$$ptrx
100
[root@htlwk0001host test]# eval $ptrx=50
[root@htlwk0001host test]# echo $x
50

注:

  1. 1 次解释 eval 后面的命令串 echo \$$ptrx\$ 转义后得到普通的字符 $$ptrx 被替换成对应的值,即 x,所以经过第 1 次解释后得到的命令行串是 echo $x,但是第 1 次 不会去 eval 后面的命令;第 2 次才真正去解释执行命令,于是输出变量 x 的值,即 100
  2. 1 次解释 eval 后面的命令串 $ptrx=50$ptrx 被替换成对应的值,即 x,得到的命令串是 x=50,第 2 次才真正解释执行,所以就是给变量 x 赋值 50,最后 echo $x 的输出结果就是 50

Linux 命令之 eval -- 对参数执行两次解释相关推荐

  1. 在Linux命令行发送电子邮件附件的两种方法

    需 求 本文使用Centos7操作系统. 需要有一个工作正常的邮件系统.本文将不介绍如何配置邮件服务器. 1.使用mail命令 安装mailx安装包 [root@localhost ~]# yum - ...

  2. linux显示器分屏显示命令,在Linux 命令行终端分屏的两种工具

    下面介绍两种终端分屏工具:screen和tmux 一.使用screen分屏(只能上下分屏,不能左右分屏) (1)安装工具 在ubuntu系统中使用sudo apt-get install screen ...

  3. linux如何把命令放前台,Linux命令的前台或后台执行

    自然情况下,我们在Linux的terminal窗口里输入一个命令,回车执行,命令打印出结果,执行结束,命令提示符再次出现.这样的执行方式叫做前台执行. Linux命令的前台执行很常用,但是有个问题,就 ...

  4. python命令行模式怎么输入_python获得命令行输入的参数的两种方式

    外部直接执行python文件时,我们有时需要获得命令行的参数6ok免费资源网 获得命令行参数的两种方式6ok免费资源网 1.通过sys.argv6ok免费资源网 sys.argv:获得一个参数列表,第 ...

  5. linux 清空nohup日志命令,Linux命令之 nohup 和 后台执行命令使用说明

    摘要:nohup 是 no hungup 的缩写,意思是"不挂断".我们在使用Xshell等工具,远程执行Linux脚本时,有时候会由于网络问题,导致失去连接,终端断开,程序运行一 ...

  6. linux php 指令,在 Linux 命令行中使用和执行 PHP 代码(一)

    PHP是一个开源服务器端脚本语言,最初这三个字母代表的是"Personal Home Page",而现在则代表的是"PHP:Hypertext Preprocessor& ...

  7. linux命令之watch -- 周期性地执行命令

    watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行. 在Linux下,watch是周期性的执行下 ...

  8. 在 Linux 命令行中使用和执行 PHP 代码(一)

    PHP是一个开源服务器端脚本语言,最初这三个字母代表的是"Personal Home Page",而现在则代表的是"PHP:Hypertext Preprocessor& ...

  9. Linux命令之远程登录与执行远程主机命令

    实现远程登录的命令 ssh.telnet.rlogin (1)ssh命令 ssh命令是openssh套件中的客户端连接工具,可以给予ssh加密协议实现安全的远程登录服务器.ssh命令用于远程登录上Li ...

最新文章

  1. Python字符串的修改以及传参
  2. python linux系统管理与自动化运维_《Python Linux系统管理与自动化运维》赖明星著【摘要 书评 在线阅读】-苏宁易购图书...
  3. 基础才是重中之重~用好configSections让配置信息更规范
  4. android数据存储心得,android学习心得 轻量级存储SharePreferences
  5. go语言代码连接mysql_【mysql】golang连接mysql操作示例增删改查
  6. 鸟哥linux教学怎么样,鸟哥关于学习Linux的一些建议
  7. thinkphp 常用SQL执行语句总结
  8. Python天天学_03_基础三
  9. mysql宾馆客房管理系统视频_java swing mysql实现的酒店宾馆管理系统项目源码附带视频指导运行教程...
  10. win7 sp1简体中文升级补丁包(64位)
  11. [处理方法]微信内置浏览器 打开页面空白
  12. 写HTML为什么骨架生成不了,HTML骨架
  13. kanban 看板视图
  14. android核心版本特性(官网)
  15. 多目标跟踪(MOT)数据集资源整理分享
  16. Ubuntu 20.04使用deepin wine安装Windows官方版QQ、微信、Tim等
  17. docker容器创建
  18. HTML DOM 事件 —— 键盘事件 JS键盘事件
  19. 微众银行面试Again
  20. Docsify使用指南,使用Typora+Docsify打造最强、最轻量级的个人团队文档,及免费和开源且低成本文档工具

热门文章

  1. go比java快多少_Java 11快多少?
  2. java orm框架有哪些_Java Stream ORM现在带有JOIN
  3. java中使用jython_将Jython嵌入到您的Java代码库中
  4. jhipster_JHipster入门,第2部分
  5. hibernate查询缓存_在Hibernate中启用实体和查询缓存
  6. lambda设计模式_使用lambda的装饰器设计模式
  7. redis分片_Redis分片
  8. java 性能调优_Java性能调优调查结果(第二部分)
  9. activemq主从配置_使用ActiveMQ –具有故障转移协议的“主/从”配置
  10. j2ee可以用于前端开发吗_用于J2EE开发的Cloud IDE