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描述:
外壳程序应通过在子外壳程序环境中执行命令并将命令替换项替换为命令的标准输出,从而扩展命令替换项,并在替换结束时删除一个或多个{newline}字符的序列。
请注意,它会删除所有尾随的换行符,而不仅仅是一个。
在某种情况下,您可以使用命令替换来捕获单行输出,例如osrev=$(uname -r)
。这些实用程序通常会在命令行上打印尾随换行符,以方便用户使用。但是在shell脚本中,您可能希望将该字符串用作另一个字符串的一部分,例如filename :filename=blahblah-$osrev.dat
。在那种情况下,尾随的换行符只会是一件令人讨厌的事情。
当然,echo
在任何情况下,平原都将添加最后的换行符。
如果您希望文件的内容保持不变,那么通常的解决方法是在命令替换中添加一个额外的字符,并在以后删除该字符:
printf "foo\nbar\n\n" > file
string=$(cat file; echo x)
string=${string%x}
printf '%q\n' "$string"
输出$'foo\nbar\n\n'
,显示两个尾随的换行符。
根据您打算如何处理数据,可能还有其他方法。例如,如果您想逐行处理文件,则使用一个while read
循环或Bash的循环mapfile
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句