$'$foo' 和 $"$foo" 之间的区别

$'$foo' 和 $"$foo" 之间的区别

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

我定义:

foo=pwd

然后运行这些:

echo $'$foo'

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

echo $"$foo"

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

echo $`$foo`

最后出现了这个回声$~/scripts(我期望它打印出来~/scripts但没有$~/scripts

有人能帮我找出这些区别吗?

答案1

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

答案2

第一种情况:

echo $'$foo'

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

第一个$是作为命令运行的。Echo 不需要参数之间有空格,它只是接受它们。

因此 echo$'$foo'会扩展以运行命令$(这不是命令,因此会忽略它),然后是 echo '$foo'。 中的所有内容''都按字面意思理解 - 它不会对其进行扩展或执行任何其他操作。 您可以将所需内容放入 '' 中,但什么也不会发生。

如果用 替换,$则会$$显示进程 ID。


第二:

echo $"$foo"

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

这是因为""不会阻止它扩大。""通常用于确保有一个可以比较的值。

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


最后,第三点。这很有趣。

echo $`$foo`

这回响$~/scripts(我期望它打印~/scripts而不是$~/scripts

这是因为(在本例中)echo 会$先打印字符。在反引号中输入某些内容会导致要作为命令运行的变量的值(在较新版本的 bash 中更好的做法是$(command)

因此它首先回显,$然后扩展​`$foo`​​`pwd`​运行并返回~/Scripts。但我们$之前有打印 - 因此整个输出是$~/Scripts

相关内容