嵌套的while read循环与fd

3
我试图在嵌套循环中从两个不同的输入读取数据,但没有成功。我已经按照这个问题上最佳答案的建议进行了尝试,并查看了高级Bash脚本指南文件描述符页面
以下是我编写的用于测试问题的示例脚本。
#!/bin/bash
while read line <&3 ; do
    echo $line
    while read _line <&4 ; do
        echo $_line
    done 4< "sample-2.txt"
done 3< "sample-1.txt"

Content of sample-1.txt

Foo
Foo

Content of sample-2.txt

Bar
Bar

期望输出

Foo
Bar
Bar
Foo
Bar
Bar

我收到的输出
Foo
Bar

1
我在bash 3.2.57和4.4.12中都得到了预期的输出。我怀疑你的文本文件在最后一行没有换行符。 - chepner
@Lapsusone,顺便说一下,ABS并不是一个特别受人尊敬的参考资料;它因在其示例中展示糟糕的实践而相当臭名昭著。请考虑Wooledge Wiki(即[BashFAQ#1](http://mywiki.wooledge.org/BashFAQ/001),其中明确涵盖了您在“我的文本文件已损坏!”部分中遇到的问题)或[bash-hackers wiki](http://wiki.bash-hackers.org/)。 - Charles Duffy
哦,是的,我一直在使用bash-hackers wiki并且很喜欢它。感谢你的推荐。 - Lapsusone
1个回答

3

您的文本文件没有以换行符结尾:

$ printf 'Foo\nFoo' > sample-1.txt
$ printf 'Bar\nBar' > sample-2.txt
$ bash tmp.sh
Foo
Bar
$ printf '\n' >> sample-1.txt
$ printf '\n' >> sample-2.txt
$ bash tmp.sh
Foo
Bar
Bar
Foo
Bar
Bar

read如果在文件结尾没有看到换行符就会返回非零退出状态。虽然有一种方法可以解决这个问题,但最好确保你的文本文件以换行符正确结尾。

# While either read is successful or line is set anyway
while read line <&3 || [[ $line ]]; do

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接