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

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

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

我试过:

output=$(head $file)

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

如何按原样存储命令输出而不删除\n字符?

答案1

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

如果这是你的情况:

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

将修正输出值。

答案2

output=$(head $file)保持嵌入式的值中的换行符output,并修剪全部尾随换行符。

差异在于引用变量的方式。

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

echo "$output"

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

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

答案3

还要保留退出状态:

output=$(head < "$file"; r=$?; echo /; exit "$r")
exit_status=$?
output=${output%/}

请注意,使用比某些语言环境使用的某些字符/集更安全,x其中某些字符的编码以 的编码结尾x(而 的编码/通常不会在其他字符中找到,因为这会使路径查找出现问题) 。

相关内容