【问题标题】:What's the difference between $(...) and `...`$(...) 和 `...` 有什么区别
【发布时间】:2010-10-02 05:02:00
【问题描述】:

问题就如题中所说的那么简单:以下两种表达方式有什么区别?

$(...)
`...`

比如test1test2这两个变量有区别吗?

test1=$(ls)
test2=`ls`

【问题讨论】:

  • @theman:感谢“有见地”的评论。
  • 请注意,这不仅仅是 bash。这适用于 ksh 和普通的旧 sh(即使在不是 bash 变相的 sh 中)。

标签: bash syntax


【解决方案1】:

结果是一样的,但是新的 $() 语法更加清晰易读。尝试筑巢时至少加倍如此。使用旧语法进行嵌套并不容易,但使用新语法就可以了。

比较:

$ echo $(ls $(pwd))

对比:

$ echo `ls \`pwd\``

您需要转义嵌入的反引号,因此打字和阅读都要复杂得多。

根据this page,它们在处理嵌入的双反斜杠方面至少有一个细微差别。

【讨论】:

  • 嵌套 is 可以使用反引号语法,它只需要大量的反斜杠并且很快变得几乎不可读。特别是如果您混合使用其他类型的引号。
  • @hobbs 谢谢,我可能没有意识到。我已经编辑了答案。
【解决方案2】:

使用 ``` 是历史语法,POSIX 采用了现在标准的 `$(...) 语法。见Section 2.6.3

【讨论】:

  • 有趣。我一直认为 $( ) 语法是一个纯粹的 bash 加法(虽然非常好)。
  • 我第一次在 ksh 中看到它,早在 1992 年左右,甚至在我使用过一次 bash 之前。
  • 通常认为 $()​​ 是特定于 bash 的,但这是因为 vim 没有按照 POSIX 语法高亮显示,而是使用 very 很少有人编码的 orig shell 语法在今天。要告诉 vim 对 shell 脚本使用合理的语法突出显示,请将其放入 .vimrc let g:is_posix = 1
  • 我认为它确实首先出现在 ksh(1) 中,然后被 POSIX 采用。
【解决方案3】:

您可能想阅读man bash

当使用旧式反引号形式的替换时,反斜杠保留其字面含义,除非后面跟着 $、` 或 .前面没有反斜杠的第一个反引号终止命令替换。使用 $(command) 形式时,括号之间的所有字符组成命令;没有人受到特殊对待。

位于手册页的“命令替换”部分下。

【讨论】:

    猜你喜欢
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    • 2013-08-19
    • 2012-05-22
    相关资源
    最近更新 更多