Answers:
echo $'$foo':$'[...]'周围的标记按字面意义进行$foo 解释$foo(as $foo),并尝试在其中扩展类似于ANSI C的转义序列,这些序列不存在,所以echoyields $foo;echo $"$foo":$"[...]"周围的令牌$foo 扩展$foo到它的值(pwd),如果当前的区域不是POSIX / C,则尝试转换它 ; 这不会发生,因为当前语言环境是POSIX / C或翻译pwd不可用,所以echoyields 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。