当前位置: 首页>>技术教程>>正文


为什么 bash 删除 $(cat 文件) 中的 \n?

,

问题描述

如果我的文件 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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13611.html,未经允许,请勿转载。