$'$ foo'和$“ $ foo”之间的区别


9

我很难弄清楚可变上下文中单引号和双引号之间的细微差别

我定义:

foo=pwd

然后运行这些:

echo $'$foo'

哪个回声$foo(意味着$我的回声命令中的第一个被删除)

echo $"$foo"

这回声pwd(这意味着bash将$foo我的变量扩展到其值)

echo $`$foo`

最后,这回显$~/scripts(我希望它能打印~/scripts而不是$~/scripts

有人可以帮助我找出这些差异吗?

Answers:


11

最终,最后一个打印出来$~/scripts是因为它$`foo`是文字$和命令替换的组合。因此,前导$被解释为文字$,而尾随被解释为`$foo`命令替换。


我删除了代码标签,并仅替换了````''等字符。如果您喜欢代码标签,请随时回滚
Tim

@Tim谢谢,不确定我做了什么,但是由于某些原因,在您编辑帖子后,该帖子的出现与我的第一个修订版一样混乱,因此我将其回滚了……现在,我看到它在修订版中看起来还不错。不知道发生了什么,在回滚到您的版本之前会在格式化沙箱中对其进行测试,因为我担心我可能会再次破坏该帖子。无论如何,感谢您的努力。
kos

当然,没有问题。我的使用零宽度空格,因此在编辑时要小心。
蒂姆(Tim)

2

第一种情况:

echo $'$foo'

哪个回声$foo(意味着$我的回声命令中的第一个被删除)

第一个$作为命令运行。Echo不需要参数之间有空格,只需要它们之间就可以。

因此,echo $'$foo'扩展为运行命令$(这不是命令,因此它会忽略它),然后运行echo '$foo'。任何东西''都是从表面上获取的-它不会扩大它或任何东西。您可以在''中放入所需内容,什么也不会发生。

如果将其替换为$$$则会回显进程ID。


第二:

echo $"$foo"

这回声pwd(这意味着bash将$foo我的变量扩展到其值)

那是因为""不会阻止它扩展。""通常用于确保有一个要比较的值。

如果您有一个可能为空的变量(例如,它来自grep结果),则要与另一个值/变量进行比较,则必须将第一个变量放入中""。这样可以确保始终要进行比较检查,而不仅仅是提供错误的空白代码(如bash所见)。


最后,数字3。这很有趣。

echo $`$foo`

这回显$~/scripts(我希望它能打印~/scripts而不是$~/scripts

这是因为(在这种情况下)echo首先打印$字符。将某些内容放在反引号中会使该变量的值作为命令运行(在较新的bash版本中,执行此操作的更好方法是$(command)

因此,首先回$显然后扩展​`$foo`​​`pwd`​运行并返回~/Scripts。但是我们$早先有版画-所以整个输出是$~/Scripts


在一些非常困难的格式上做得不错!
Arronical

1
@Arronical谢谢:)您看不到它,但是最后一句话有一些零宽度的空格。我为虚构的互联网积分所做的事情...!
蒂姆(Tim)

1
+1好答案。我只是要加上引号变量应该是默认值,除非您有特定的理由不这样做-不仅仅是为了处理可能的null值。有关更多信息,请参见unix.stackexchange.com/questions/171346/…。;)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.