![在变量中捕获命令的输出时如何保留换行符 (\n)](https://linux22.com/image/79126/%E5%9C%A8%E5%8F%98%E9%87%8F%E4%B8%AD%E6%8D%95%E8%8E%B7%E5%91%BD%E4%BB%A4%E7%9A%84%E8%BE%93%E5%87%BA%E6%97%B6%E5%A6%82%E4%BD%95%E4%BF%9D%E7%95%99%E6%8D%A2%E8%A1%8C%E7%AC%A6%20(%5Cn).png)
举一个简单的例子,我有一堆源代码文件。我想将所有这些文件的“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
(而 的编码/
通常不会在其他字符中找到,因为这会使路径查找出现问题) 。