我很难弄清楚变量上下文中单引号和双引号之间的细微差别
我定义:
foo=pwd
然后运行这些:
echo $'$foo'
哪个回显$foo
(意味着我的回显命令中的第一个$
被删除)
echo $"$foo"
这会产生回声pwd
(这意味着 bash 将$foo
我的变量扩展为其值)
echo $`$foo`
最后出现了这个回声$~/scripts
(我期望它打印出来~/scripts
但没有$~/scripts
)
有人能帮我找出这些区别吗?
答案1
echo $'$foo'
:$'[...]'
周围的标记$foo
按字面意思解释$foo
(为$foo
),并尝试扩展其中的 ANSI C 类转义序列,不存在,所以echo
得到$foo
;echo $"$foo"
:$"[...]"
周围的标记$foo
如果当前语言环境不是 POSIX / C,则扩展$foo
为其值 ( ) 并尝试翻译它pwd
pwd
;这不会发生,因为当前语言环境是 POSIX / C,或者没有可用的翻译,因此echo
产生pwd
;echo $`$foo`
:`[...]`
周围的标记$foo
允许扩展$foo
,因此$foo
扩展为其值(pwd
);扩展的值在子 shell 中运行,其输出(~/scripts
)替换整个`[...]`
标记,因此echo
产生$
标记,后跟~/scripts
标记($~/scripts
)。
最终,最后一个打印是$~/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
。