file.txt 的内容(不奇怪,POSIX 定义的文本文件)
iguana
gecko
anole
示例脚本:
#!/bin/sh
string="$(cat file.txt)"
printf '%s' "$string"
样本输出:
[coolguy@somemachine ~]$ ./script.sh
iguana
gecko
anole[coolguy@somemachine ~]$
最后一个换行符发生了什么?为什么除了最后一个保留的换行符都是换行符?如果应该已经有一个换行符,我们似乎不应该使用 echo 添加一个换行符。
这不是打印,而是执行此操作的命令替换。它被定义为这样做。从POSIX 描述:
请注意,它会删除所有尾随换行符,而不仅仅是一个。
在一些常见的情况下,您会使用命令替换来捕获单行输出,例如
osrev=$(uname -r)
. 实用程序通常打印尾随换行符,以方便用户在命令行上使用。但在 shell 脚本中,您可能希望将该字符串用作另一个字符串的一部分,例如文件名:filename=blahblah-$osrev.dat
. 在这种情况下,尾随的换行符只会令人讨厌。当然,
echo
在任何情况下,plain 都会添加最后一个换行符。如果您希望文件的内容在变量中保持原样,那么常见的解决方法是在命令替换中添加一个额外的字符,然后将其删除:
输出
$'foo\nbar\n\n'
,显示两个尾随换行符。根据您打算如何处理数据,可能还有其他方法。例如,如果您碰巧想逐行处理文件,则
while read
循环或 Bash 的。mapfile