Bash变量-变量末尾嵌入换行符

5

我已经阅读了在bash中尝试嵌入换行符,我理解了换行符作为IFS以及bash有时将换行符转换为空格的情况,但是我不理解以下情况:

[prompt]$ blah="$(printf "hi\n\n\n\n")"
[prompt]$ echo "$blah"
hi
[prompt]$ blah="$(printf "hi\n\n\n\nx")"
[prompt]$ echo "$blah"
hi



x

为什么第一个回声没有输出一堆换行符呢?谢谢。

你可以完全避免使用命令替换,而是使用printf -v blah "hi\n\n\n\n"或者blah=$'hi\n\n\n\n' - chepner
对于在家跟进的人,您可以通过执行“man bash”并搜索“dollar”来了解“$'string'”语法。返回大约一页以阅读有关它的所有信息。 - Mike S
1个回答

5
因为这就是规范(the spec)要求 shell 应该执行的操作,即删除结尾处的换行符序列。根据规范(以下是我强调的部分):
引用块:

Shell 必须通过在子 shell 环境中执行命令并替换命令替换文本(即命令加上"$()"或反引号),以执行命令替换,并删除一或多个 newline 字符序列的标准输出。输出的结尾之前嵌入的 newline 字符不会被删除;但是,它们可能被视为字段定界符并在字段拆分期间消除,具体取决于 IFS 值和生效的引用方式。如果输出包含任何空字节,则行为未指定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接