Shell中反引号(`)与$()用法的区别

今天有人提问:

 

	echo `echo \\\\\\\w`
	echo $(echo \\\\\\\w)
	为什么输出的不一样?

 

这就引申出了另一个问题:反引号与$()有没有区别?

这是一个非常有意思的问题,但要解释这个问题确比较困难,我来换一个简单一点的例子,通俗的解释一下。

比如我们有一个shell脚本名为test.sh有一下两行


1

2

echo  `echo \$HOSTNAME`     //反引号

echo $(echo \$HOSTNAME)    //$()

  我们可以使用sh -x test.sh来分析bash是如何来解释这个脚本的,返回的信息如下:

  通过上图我们可以得出两个结论:

  1. 反引号中\$并没有将$的特殊意义转换 反引号包含的内容 echo \$hostname 仍然被解释为一个echo $HOSTNAME 取到了这个变量的值并输出所以反引号返回的值为 CentOS-1
  2. $()则正好相反,$明显被\转义成了一个普通字符,所以并没有取到变量值,而是返回了字符串本身的意思,故而返回了$HOSTNAME

  这说明反引号对反斜杠(\)有特殊的转化,至少我们看到当我们直接用1个\时,它本身并不会起到转义的作用。现在我们将脚本的内容做一些修改:


1

2

echo  `echo \\$HOSTNAME`     //反引号

echo $(echo \\$hostname)    //$()

  我们又多加了1个反斜杠,这次我们来看输出的情况:

  这次看起来似乎反转了:

  1. 反引号反而输出了$HOSTNAME的字面意思
  2. $()如我们所愿的取到了变量值,并理所应当的输出了一个被转义的字符串\

  我们再来做一个实验,再建立一个脚本名为a.sh:


1

2

echo    `echo \\\\ `    

echo  $(echo \\\\ )

  注意:最后一个反引号和)的前面都有一个空格,否则最后一个反引号和)都将被注释,不会被当做结束的替换符号。

  使用sh -x a.sh的结果如下:

  通过上图我们可以看到:

  1. 反引号中4个\被输出为1个\
  2. $()中4个\被输出为2个\

  我们将脚本修改为8个\:


1

2

echo   `echo \\\\\\\\ `    

echo  $(echo \\\\\\\\ )

  再看输出:

  由此,我们可以得出结论:

  1. 反引号齐本身就对\进行了转义,保留了齐本身意思,如果我们想在反引号中起到\的特殊意义,我们必须使用2个\来进行表示。

    所以我们可以简单的想象成反引号中: \\ = \

  2. $()中则不需要考虑\的问题,与我们平常使用的一样:\ = \

题外话: 反引号是老的用法,$()是新的用法,不管是在学习测试中,还是在实际工作中,$()的用法都是被推荐的。

时间: 2024-10-26 08:40:06

Shell中反引号(`)与$()用法的区别的相关文章

Linux中yum和apt-get用法及区别

Linux中yum和apt-get用法及区别 一般来说著名的linux系统基本上分两大类: 1.RedHat系列:Redhat.Centos.Fedora等 2.Debian系列:Debian.Ubuntu等 RedHat 系列 1 常见的安装包格式 rpm包,安装rpm包的命令是"rpm -参数" 2 包管理工具 yum 3 支持tar包 Debian系列 1 常见的安装包格式 deb包,安装deb包的命令是"dpkg -参数" 2 包管理工具 apt-get 3

深入分析js中call与apply用法与区别

对于call.apply最直接的理解就是继承. call和apply,它们的作用都是将函数绑定到另外一个对象上去运行 两者的格式和参数定义: call( thisArg [,arg1,arg2,- ] );       // 参数列表,arg1,arg2,... apply(thisArg [,argArray] );                 // 参数数组,argArray 上面两个函数内部的this指针,都会被赋值为thisArg,这可实现将函数作为另外一个对象的方法运行的目的 我们

python中raw_input和input用法与区别

在使用python编写交互式程序时,经常用到的两个内部函数是raw_input和input(最常用还是input) ,本篇就通过一些示例看下两者之间的区别 . 一.raw_input 1.输入字符串  代码如下 复制代码 nID = '' while 1:     nID = raw_input("Input your id plz")     if len(nID) != len("yang"):         print 'wring length of id

php中$_GET,$_POST,$_REQUEST用法与区别分析

1. $_REQUEST 默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组.  代码如下 复制代码 <?php $_GET['foo'] = 'a'; $_POST['bar'] = 'b'; var_dump($_GET); // Element 'foo' is string(1) "a" var_dump($_POST); // Element 'bar' is string(1) "b" var_dump($_REQUEST);

Html A标签中 href 和 onclick用法、区别、优先级别

如果不设置 href属性在IE6下面会不响应hover.双击后会选中标签的父容器而非这个一a标签(IE下都存在这一问题).  代码如下 复制代码 <a href="javascirpt:fn(this)"> <a onclick="fn(this)"> 假定我们有个fn方法,需要取到这个元素,第一个方法传入的this是空值. 所以,比较推荐的写法是  代码如下 复制代码 <a href="javascript:void(0)&

jquery中appendTo与append用法与区别

appendTo用法 定义和用法 appendTo() 方法在被选元素的结尾(仍然在内部)插入指定内容. $(content).appendTo(selector) 参数: content 必需.规定要插入的内容(可包含 HTML 标签). selector 必需.规定把内容追加到哪个元素上.    代码如下 复制代码 <span class="yuanlai_keleyi_com">柯乐义,这是span里的内容,keleyi.com.<a href="&q

php中 -&gt;与 ==&gt;符号的用法与区别

"->"(减号.右尖括号) 用于类中,访问类里的函数或对象,比如:  代码如下 复制代码 <?php class Test { function do_test() { echo "Doing foo."; } } $bar = new Test; $bar->do_test(); ?> "=>"(等号.右尖括号) 数组中给值赋值,比如:  代码如下 复制代码 $arr=array("one" =

php中empty与isset用法与区别

 代码如下 复制代码 $a=0; 这个时候 empty($a) == true; isset($a) == true; $a=1; 这个时候 empty($a) == false; isset($a) == true; 在没有定义$a的时候,isset($a) == true; empty($a) == true; 其共同点就是empty()和isset()都是变量处理函数,作用是判断变量是否已经配置,正是由于它们在处理变量过程中有很大的相似性,才导致对它们的关系认识不足.单从empty()和i

jQuery中wrap和wrapAll用法以及区别

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <script src="../../scripts/jquery-1.3.1.js" type="text/javascript"></script>  <script type="