要将命令的输出作为一个变量存储在sh/ksh/bash中,您可以使用任何一种方法
var=$(command)
或
var=`command`
这两种方法有什么区别?
除了可以在命令中使用哪些非转义字符之外,两者几乎没有区别。你甚至可以把“……”命令放在美元(…)命令中(反之亦然),以实现更复杂的两级命令替换。
对反斜杠字符/操作符的解释略有不同。除此之外,当嵌套“……”替换命令时,必须使用\,转义内部的`字符,而使用$ ()替换时,它会自动理解嵌套。
由于$()可以像在$(echo foo$(echo bar))中那样容易地嵌套在自己内部,因此反勾号/重号标记已被弃用,而支持$()进行命令替换。还有其他不同之处,比如反斜杠在反标记/墓碑版本中的解析方式,等等。
$()
$(echo foo$(echo bar))
请参阅< >强BashFAQ / 082 < / >强,了解始终偏爱$(…)语法的几个原因。
也可以查看< >强POSIX < / >强规范以获得关于各种不同的详细信息。
当使用旧的反斜杠形式时,反斜杠保留其字面意义,除非后面跟着$、'或\。前面没有反斜杠的第一个反标记将终止命令替换。
当使用较新的$(command)形式时,括号之间的所有字符组成命令;没有人被特别对待。
$(command)
这两种形式都可以嵌套,但反标记形式需要以下形式。
`echo \`foo\``
相对于:
$(echo $(foo))
它们的行为是一样的。区别在于语法:嵌套$()比嵌套``更容易:
``
listing=$(ls -l $(cat filenames.txt))
vs。
listing=`ls -l \`cat filenames.txt\``
2014年7月:提交f25f5e6 (by Elia Pinto (devzero2000), 2014年4月,Git 2.0)增加了嵌套问题:
devzero2000
反引号形式是POSIX支持的命令替换的传统方式 然而,除了最简单的用途外,所有的用途都会很快变得复杂 特别是,需要嵌入命令替换和/或双引号的使用 小心逃跑的反斜杠字符< /强>。< / p >
这就是为什么git /文档/ CodingGuidelines提到:
我们更喜欢$( ... )命令替换;不像' ',它能正确地筑巢。< br > 这应该是伯恩从第一天开始的拼写方式,但不幸的是,它不是
$( ... )
thiton 评论:
这就是为什么`echo `foo``一般不会工作的原因,因为固有的模糊性,因为每个__abc1可以打开或关闭 它可能适用于由于运气或特殊特征的特殊情况
`echo `foo``
2016年1月更新:Git 2.8(2016年3月)完全摆脱了反勾号。
gitster
从Git 2.8开始,它都是$(...),不再是`...`。
$(...)
`...`
“这两种方法有什么不同吗?”
注意这种行为:
A="A_VARIABLE" echo "$(echo "\$A")" echo "`echo "\$A"`"
你会得到以下结果:
$A A_VARIABLE
,