“

我有以下脚本:

while read lineA && read lineB <&3
do
    echo "$lineA"
    echo "$lineB"
    echo
done < file11 3< file22

这段代码运行良好。但我不明白这些:

  • <&3
  • done < file11 3< file22

答案1

该脚本从两个文件中读取字符串对。在每次迭代中,它从file11intolineA和 from file22into读取一个字符串lineB。它会执行此操作,直到遇到任一文件的末尾。循环体输出两个字符串和一个空行。

意思<file11是“将标准输入连接/重定向file11到此命令”,其中“此命令”是while循环。这也可以写0<file11

标准输入是文件描述符编号 0。文件描述符 1 和 2 保留用于标准输出和标准错误流。

意思3<file22是“将文件描述符 3 连接file22到此命令”。数字 3 恰好是下一个“空闲”文件描述符编号,但代码可以使用 4 或 5 或除 0、1 和 2 之外的任何小整数(可用文件描述符编号的限制取决于 shell 的类型)正在使用,但 9 以内的数字保证有效)。

在循环中,read lineA默认会从标准输入,即从文件中读取字符串file11(标准输入是从循环继承的)。这也可以写read lineA <&0

对于read lineB <&3,该read命令从文件描述符 3 读取,即从file22,而不是从标准输入读取(文件描述符 3 在循环中可用,就像标准输入一样)。

简而言之,它使用标准输入流和“额外”文件描述符(数字 3)“同时”从两个文件中读取(依次从每个文件中一次读取一个字符串)。通常,一个人只能访问输入流,但这通过显式创建第二个输入流并将其连接到文件来绕过该限制file22

有关的:


我在上面使用“串”这个词而不是“线”。从两个文件中读取的内容将去除两侧的空格,并且某些转义序列将被特殊解释。

阅读一个线使用read,使用

IFS= read -r varname

有关的:

相关内容