在变量中捕获命令的输出时如何保留换行符 (\n)

ret*_*n 0 13 shell bash command-substitution newlines

作为一个简单的例子,我有一堆源代码文件。我想将“head”命令输出存储到所有这些文件的变量中。

我试过:

output=$(head $file)
Run Code Online (Sandbox Code Playgroud)

但发生的情况是,\n在将输出存储到变量时,这会自动修剪所有字符。

如何在不删除\n字符的情况下按原样存储命令输出?

Rob*_*rtL 10

output=$(head $file)嵌入的换行符保留在 的值中output,并修剪所有尾随换行符。

这就是你如何引用产生差异的变量。

将变量引用放在双引号内,例如:

echo "$output"
Run Code Online (Sandbox Code Playgroud)

打印嵌入的换行符,但打印由命令 expand 删除的尾随换行符$(...)

这是有效的,因为 shell 只解释美元符号、命令扩展(反引号和$(...))以及双引号内的反斜杠;在双引号内时,shell 不会将空格(包括换行符)解释为字段分隔符。

  • 命令替换确实吃掉了尾随的换行符。 (2认同)

小智 10

这是“命令扩展”的一个已知缺陷,$(...)或者`...`最后一个换行符被修剪。

如果这是你的情况:

$ output="$(head -- "$file"; echo x)"     ### capture the text with an x added.
$ output="${output%?}"                    ### remove the last character (the x).
Run Code Online (Sandbox Code Playgroud)

将更正输出值。

  • 此外,如果变量扩展没有被引用,则使用例如 `echo` 输出值将永远不会保留内部换行符。参见例如`echo $multiline` 和`echo "$multiline"` 之间的区别。另外:[为什么 printf 比 echo 好?](//unix.stackexchange.com/q/65803) (3认同)
  • 嗨:-)我会说“最后的换行符被修剪”。我对吗 ? (2认同)