在shell的学习中,我们会遇到这两种符号:反引号(` `)和$(),那么它们之间有什么区别和联系呢?

我们都知道在bash中,反引号和$()都是用来做命令替换的,命令替换就是用来重组命令行,先完成引号里面的命令,然后将其结果替换出来,再重组成新的命令行。也就是在执行一条命令时,会现将其中的` `,或者是$()中的语句当做命令执行一遍,再将结果加入到原命令中重新执行,例如:

从上面我们可以看到,当我们echo反引号里面的ls命令时,和我们直接执行ls命令是一样的,也就正应里我们前面说的,也就是在执行一条命令时,会现将其中的` `,或者是$()中的语句当做命令执行一遍,再将结果加入到原命令中重新执行。

虽然在操作上,这两种都能达到同样的效果,但是在平时的使用中,我们尽量使用$(),因为:

首先,反引号` `与单引号‘ ’在使用上很可能混淆,给我们带来不必要的麻烦

其次,在多层次的复合替换中,反引号` `需要有额外的跳脱处理(反斜杠),而$()比较直观;

但是$()的弊端就是并不是所有的unix系统都支持这种方式,但反引号是肯定支持的。


eval命令用法:

当我们在命令行前加上eval时,shell就会在执行命令之前扫描它两次.eval命令将首先会先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。

1. eval可以用来回显简单的变量:

这样和普通的没有加eval关键字的命令的作用一样

2.eval也能用来执行含有字符串的命令:

首先我们先来创建一个file文件,在这个文件中输入一些我们想要输出的文本,然后我们将cat file赋给变量myfile,整个过程如下:

从上面我们可以看到,当我们把cat file直接赋予myfile变量后,我们直接echo myfile的内容将不会输出我们在file文件里面的文本。然后当我们用eval命令后,就会输出我们想要的内容。这时因为eval命令不但可以置换该变量,还能执行相应的命令。在第一次扫描中进行了变量置换,第二次扫描就执行了该变量所包含的字符串里面的cat file 命令,所以就输出了我们想要的内容。

3.eval命令还可以显示我们传递给脚本的最后一个参数:

我们现在有如下一个脚本:

我们有如下的执行过程:

从上面的执行结果们可以看到,当我们执行该脚本时,结果总是我们输入的最后一个参数,这时怎么回事呢?这正是eval的这种用法,在上面的脚本中,eval命令首先把$$#解析为当前shell的参数个数(我们这里为4),然后再第二次扫描时才得出最后一个参数。

4.eval命令也可以创建指向变量的指针:

在上面的命令中,我们先定义了一个变量val=100;然后又定义了个ptr并把val赋予之。然后我们用eval命令来解析ptr的值,我们可以看到是100.然后我们通过ptr修改了val的值,此时再看val的值,就变成了50了。

eval用法的更多相关文章

  1. ASP.NET中EVAL用法大全

    <%# Bind("Subject") %> //绑定字段<%# Container.DataItemIndex + 1%> //实现自动编号<%# ...

  2. JavaScript学习(2)call&apply&bind&eval用法

    javascript学习(2)call&apply&bind&eval用法 在javascript中存在这样几种特别有用的函数,能方便我们实现各种奇技淫巧.其中,call.bi ...

  3. shell eval用法

    转自:http://blog.csdn.net/w_ww_w/article/details/7075867 eval可读取一连串的参数,然后再依参数本身的特性来执行.eval是shell内建命令,可 ...

  4. sqlmap --eval 用法

    今天查资料发现 sqlmap 有一个 --eval 的参数 --eval=EVALCODE Evaluate provided Python code before the request (e.g. ...

  5. linux之eval用法(高级bash程序员的必修之技)

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

  6. eval 用法

    计算 eval('1+1') # 2 在字典中提取键 的值 eval('a',{'a':1}) # 1 计算 Boolean 值 eval( 'True',{'a':1}) # True eval(' ...

  7. python eval 用法

    eval 功能:将字符串str当成有效的表达式来求值并返回计算结果. 语法: eval(source[, globals[, locals]]) -> value 参数: source:一个Py ...

  8. matlab:eval用法

    1.自动生成变量 % auto general variabalsb=rand(3,3)for i=1:8    eval(['a_',num2str(i),'=','b(',num2str(i),' ...

  9. 有关eval用法的小结

    首先要明白eval.这个是可以把字符串代码,直接当做js运行.比如 var ss="alert(1);";这个时候ss保存的是文本. 使用 eval(ss);这样就相当于,执行了s ...

随机推荐

  1. 记一次生产kafka消息消费的事故

    事故背景: 我们公司与合作方公司有个消息同步的需求,合作方是消息生产者,我们是消息消费者,他们通过kafka给我们推送消息,我们实时接收,然后进行后续业务处理.昨天上午,发现他们推送过来的广场门店信息 ...

  2. nlp语义理解的一点儿看法

    nlp领域里,语义理解仍然是难题! 给你一篇文章或者一个句子,人们在理解这些句子时,头脑中会进行上下文的搜索和知识联想.通常情况下,人在理解语义时头脑中会搜寻与之相关的知识.知识图谱的创始人人为,构成 ...

  3. Spring Boot 知识笔记(热部署)

    热部署原理: 使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader ...

  4. windows 安装 numpy scipy matplotlib scikit-learn

    直接使用  pip install 包名  的方法安装不成功 下载第三方安装包 下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy  根据系统 ...

  5. 5 系统的软中断CPU升高,一般处理办法?

    还是需要多动手,一个一个问题个被get!

  6. Python【每日一问】29

    问: [基础题]:给一个不多于 5 位的正整数,要求:一.求它是几位数,二.逆序印出各位数字[提高题]:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加 ...

  7. Linux内核klist链表分析

    1.前言 在Linux内核的源码中,除了简洁的list链表外,内核还有klist链表,它是list链表的线程安全版本,在结构体中提供了整个链表的自旋锁,对链表节点查找.插入和删除等操作,都需要先获得这 ...

  8. Java 中常见的 final 类

    Java 中常见的 final 类 java.lang 包 public final class Boolean extends Object implements Serializable, Com ...

  9. C基本语法

    分号 ; 在C程序中,分好是语句结束符,每个语句必须以分好结束,它表明一个逻辑实体的结束 例如: printf("Hello, World! \n"); ; 注释 // 单行注释 ...

  10. C语言中字符型,整数型,浮点型在内存中如何存储

    ···void main() { unsigned char a = 97; printf("%p",&a); printf("%c,%d\n", a, ...