在每个人都惊慌失措并说这是一个重复之前,我想指出,虽然有很多关于逐行读取文件的问题,但我发现没有一个是关于将整个文件存储到单个变量中。相反,大多数问题似乎是关于在读取时对每一行执行某种操作。例如,请考虑以下内容:
#!/bin/sh
while IFS='' read -r line || [ -n "$line" ]; do
echo "$line"
done < file
我似乎无法为我的特定目的实现它。当我执行以下操作时:
#!/bin/sh
newline='
'
string=''
while IFS='' read -r line || [ -n "$line" ]; do
string="$string""$line""$newline"
done < file
echo "$string"
我几乎到达那里,但现在末尾有一个额外的换行符,我的字符串不等于我的文件。我已经玩了很长时间了,我似乎无法读取文件,因此我生成的字符串与我的文件完全相同。
您无条件地添加一个换行符,带有string="$string""$line""$newline"
赋值。
read
只要成功读取一行(包括换行符(,就会返回 true。检查$line
是否包含任何内容会处理可能的最终行片段。但是当你处理它时,你不需要添加换行符,因为它一开始就不存在。只要没有最后的行片段,脚本就可以正常工作。
通过将[ -n "$line" ]
测试移到循环之外可能是最简单的解决方法:
#!/bin/sh
newline='
'
string=
while IFS= read -r line; do
string="$string$line$newline"
done < "$1"
if [ "$line" ]; then
string="$string$line"
fi
echo "<$string>" # markers for clarity
当然,也可能是输入文件只有完整的行,而额外的换行符是echo
打印的换行符。使用printf "%s" "$string"
仅打印变量的内容,而不打印换行符或其他任何内容。有些 shellecho -n
抑制最后的换行符,但这是不标准的。