举一个简单的例子,我有一堆源代码文件。我想将所有这些文件的“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
(而 的编码/
通常不会在其他字符中找到,因为这会使路径查找出现问题) 。