Answers:
echo $'$foo'
:$'[...]'
周围的标记按字面意义进行$foo
解释$foo
(as $foo
),并尝试在其中扩展类似于ANSI C的转义序列,这些序列不存在,所以echo
yields $foo
;echo $"$foo"
:$"[...]"
周围的令牌$foo
扩展$foo
到它的值(pwd
),如果当前的区域不是POSIX / C,则尝试转换它 ; 这不会发生,因为当前语言环境是POSIX / C或翻译pwd
不可用,所以echo
yields pwd
;echo $`$foo`
:`[...]`
周围的令牌$foo
允许扩展$foo
,因此$foo
扩展为其值(pwd
); 扩展值在子外壳中运行,该子外壳的输出(~/scripts
)替换整个`[...]`
令牌,因此echo
产生$
令牌,后跟~/scripts
令牌($~/scripts
)。最终,最后一个打印出来$~/scripts
是因为它$`foo`
是文字$
和命令替换的组合。因此,前导$
被解释为文字$
,而尾随被解释为`$foo`
命令替换。
第一种情况:
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
。