Shell中反引号(`)与$()用法的区别
今天有人提问:
echo `echo \\\\\\\w`
echo $(echo \\\\\\\w)
为什么输出的不一样?
这就引申出了另一个问题:反引号与$()有没有区别?
这是一个非常有意思的问题,但要解释这个问题确比较困难,我来换一个简单一点的例子,通俗的解释一下。
比如我们有一个shell脚本名为test.sh有一下两行
|
1
2
|
echo `echo \$HOSTNAME` //反引号echo $(echo \$HOSTNAME) //$() |
我们可以使用sh -x test.sh来分析bash是如何来解释这个脚本的,返回的信息如下:
通过上图我们可以得出两个结论:
反引号中\$并没有将$的特殊意义转换 反引号包含的内容 echo \$hostname 仍然被解释为一个echo $HOSTNAME 取到了这个变量的值并输出所以反引号返回的值为 CentOS-1
$()则正好相反,$明显被\转义成了一个普通字符,所以并没有取到变量值,而是返回了字符串本身的意思,故而返回了$HOSTNAME
这说明反引号对反斜杠(\)有特殊的转化,至少我们看到当我们直接用1个\时,它本身并不会起到转义的作用。现在我们将脚本的内容做一些修改:
|
1
2
|
echo `echo \\$HOSTNAME` //反引号echo $(echo \\$hostname) //$() |
我们又多加了1个反斜杠,这次我们来看输出的情况:
这次看起来似乎反转了:
反引号反而输出了$HOSTNAME的字面意思
$()如我们所愿的取到了变量值,并理所应当的输出了一个被转义的字符串\
我们再来做一个实验,再建立一个脚本名为a.sh:
|
1
2
|
echo `echo \\\\ ` echo $(echo \\\\ ) |
注意:最后一个反引号和)的前面都有一个空格,否则最后一个反引号和)都将被注释,不会被当做结束的替换符号。
使用sh -x a.sh的结果如下:
通过上图我们可以看到:
反引号中4个\被输出为1个\
$()中4个\被输出为2个\
我们将脚本修改为8个\:
|
1
2
|
echo `echo \\\\\\\\ ` echo $(echo \\\\\\\\ ) |
再看输出:
由此,我们可以得出结论:
反引号齐本身就对\进行了转义,保留了齐本身意思,如果我们想在反引号中起到\的特殊意义,我们必须使用2个\来进行表示。
所以我们可以简单的想象成反引号中: \\ = \
$()中则不需要考虑\的问题,与我们平常使用的一样:\ = \
题外话: 反引号是老的用法,$()是新的用法,不管是在学习测试中,还是在实际工作中,$()的用法都是被推荐的。
Shell中反引号(`)与$()用法的区别的更多相关文章
- Linux Shell中有三种引号的用法
Linux Shell中有三种引号,分别为双引号(" ").单引号(' ')以及反引号(` `). 其中双引号对字符串中出现的$.''.`和\进行替换:单引号不进行替换,将字符串中 ...
- Shell中反引号和$()的区别
Shell中可以用来实现变量代换的命令有两种,一种是由反引号括起来的一条命令另一种是由$()括起来一条命令,shell先执行这条命令,然后见输出结果立刻代换到当前命令行中. 例如定义一个变量存放dat ...
- Shell中三种引号的用法及区别
Linux Shell中有三种引号,分别为双引号(" ").单引号(' ')以及反引号(` `). 其中双引号对字符串中出现的$.''.`和\进行替换:单引号不进行替换,将字符串中 ...
- 【转】shell的反引号、单引号、双引号的作用
Linux Shell中有三种引号,分别为双引号(" ").单引号(' ')以及反引号(` `). 其中双引号对字符串中出现的$.''.`和\进行替换:单引号不进行替换,将字符串中 ...
- Linux中yum和apt-get用法及区别
Linux中yum和apt-get用法及区别 一般来说著名的linux系统基本上分两大类: 1.RedHat系列:Redhat.Centos.Fedora等 2.Debian系列:Debi ...
- Html A标签中 href 和 onclick用法、区别、优先级别
原文:Html A标签中 href 和 onclick用法.区别.优先级别 如果不设置 href属性在IE6下面会不响应hover.双击后会选中标签的父容器而非这个一a标签(IE下都存在这一问题). ...
- shell中sh, exec, source, fork, ./的区别
shell中sh, exec, source, fork, ./的区别 1,sh sh test.sh sh是通过创建子进程(subshell)去执行脚本,父进程无法使用子进程中的变量,而子进程对 ...
- 有关shell中冒号的特殊用法
有关shell中冒号的特殊用法,供朋友们参考. : ${VAR:=DEFAULT} 当变量VAR没有声明或者为NULL时,将VAR设置为默认值DEFAULT.如果不在前面加上:命令,那么就会把${VA ...
- linux bash shell中,单引号、 双引号,反引号(``)的区别及各种括号的区别
一.单引号和双引号 首先,单引号和双引号,都是为了解决中间有空格的问题. 因为空格在Linux中时作为一个很典型的分隔符,比如string1=this is astring,这样执行就会报错.为了避免 ...
随机推荐
- 基于Linux下Iptables限制BT下载的研究
基于Linux下Iptables限制BT下载的研究 摘要: 当前BT下载技术和软件飞速发展,给人们网上冲浪获取资源带来了极大的便利, 但同时BT占用大量的网络带宽等资源也给网络和网络管理员 ...
- TortoiseSvn介绍 客户端
转载自:http://www.cnblogs.com/lyhabc/articles/2482381.html TortoiseSvn 是 Subversion 版本控制系统的一个免费开源客户端,可以 ...
- 分享一个vueui axios-mock-adapter 中的用法
import axios from 'axios'; import MockAdapter from 'axios-mock-adapter'; import { LoginUsers, Users ...
- OpenCV中数据转换
在OpenCV中Mat.CvMat和IplImage类型都可以代表和显示图像.IplImage由CvMat派生,而CvMat由CvArr派生即CvArr -> CvMat -> IplIm ...
- XML获取节点信息值
XmlDocument doc = new XmlDocument(); doc.LoadXml(sreturn); XmlNode xNode = doc.SelectSingleNode(&quo ...
- JAVA文件读取FileReader
JAVA文件读取FileReader 导包import java.io.FileReader 创建构造方法public FileReader(String filename),参数是文件的路径及文件名 ...
- IOS的四种数据存储方式及优劣
IOS有四种经常使用数据存储方式: 第一种方法:用NSUserDefaults存储配置信息 NSUserDefaults被设计用来存储设备和应用的配置信息.它通过一个工厂方法返回默认的.也是最经常使用 ...
- 13.2 UPDATE
13.2 UPDATE正在更新内容.请稍后
- jquery--延迟对象
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- php实现简单算法3
php实现简单算法3 这篇文章主要介绍了PHP经典算法集锦,整理了各种常见的算法,包括排序.查找.遍历.运算等各种常见算法原理与实现技巧,需要的朋友可以参考下 1.首先来画个菱形玩玩,很多人学C时在书 ...