问题描述
如果我的文件 input.txt
包含:
hello
world
!
然后执行 bash 命令 echo $(cat input.txt)
将输出:
hello world !
为什么以及如何修复它以准确输出文件中的内容以及文件中的内容?
最佳办法
如果你使用
echo "$(cat input.txt)"
它会正常工作。
可能 echo 的输入是用换行符分隔的,它会把它作为单独的命令来处理,所以结果将没有换行符。
次佳办法
引自 bash 手册页,Command Substitution
节:
\\n
Embedded newlines are not deleted, but they may be removed during\\n word splitting.
\\n
更进一步,同一部分:
\\n
If the substitution appears within double quotes, word splitting and\\n pathname expansion are not performed on\\n the results.
\\n
这就是 echo "$(cat /etc/passwd)"
起作用的原因。
此外,应该知道,命令替换 by POSIX specifications 会删除尾随换行符:
$ echo "$(printf "one\ntwo\n\n\n")"
one
two
因此,通过 $(cat file.txt)
输出文件可能会导致尾随换行符丢失,如果优先考虑整个文件的完整性,这可能会成为一个问题。
第三种办法
您可以保留换行符,例如将 IFS 设置为空:
$ IFS=
$ a=$(cat links.txt)
$ echo "$a"
link1
link2
link3