我有两个文本文件,我试图逐行逐行阅读.这些文件不一定具有相同的行数,并且当脚本到达任一文件的末尾时,脚本应该停止读取.我想尽可能保持这种“纯粹”的打击.我发现这样做的大部分解决方案都表明了以下形式:
while read -r f1 && read -r f2 <&3; do
echo "$f1"
echo "$f2"
done < file1 3<file2
但是,如果文件的最后一行没有换行符,则会失败.
while IFS='' read -r line || [[ -n "$line" ]]; do
echo "$line"
done < file1
但是当我尝试通过以下方式扩展它来读取多个文件时:
while IFS='' read -r f1 || [[ -n "$f1" ]] && read -r f2 <&3 || [[ -n "$f2" ]]; do
echo "$f1"
echo "$f2"
done < file1 3<file2
要么
while IFS='' read -r f1 && read -r f2 <&3 || [[ -n "$f1" || -n "$f2" ]]; do
echo "$f1"
echo "$f2"
done < file1 3<file2
我似乎无法使逻辑正确,并且循环要么不终止或完成而不读取最后一行.
我可以使用以下方法获得所需的行为
while true; do
read -r f1 <&3 || if [[ -z "$f1" ]]; then break; fi;
read -r f2 <&4 || if [[ -z "$f2" ]]; then break; fi;
echo "$f1"
echo "$f2"
done 3<file1 4<file2
然而,这似乎不符合正常(?)
while ... read ...; do
...
done
我看到的用于阅读文件的习语.
是否有更好的方法可以同时读取两个可能具有不同行数和最后一行不是换行符的文件?
我阅读文件的方式有哪些潜在的缺点?
解决方法:
您可以覆盖&&的优先级.和||操作符将它们与{}分组:
while { IFS= read -r f1 || [[ -n "$f1" ]]; } && { IFS= read -r f2 <&3 || [[ -n "$f2" ]]; }; do
一些注意事项:在这种情况下,您不能使用()进行分组,因为这会强制其内容在子shell中运行,而子shell中读取的变量在父shell中不可用.另外,你需要一个;在每个}之前,所以shell可以告诉它不仅仅是最后一个命令的参数.最后,在每个读取命令之前需要IFS =(或等效IFS =”),因为作为命令前缀的赋值仅适用于该命令.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。