我正在开始bash
脚本练习。我正在尝试做一个嵌套循环,从两个不同的来源读取变量,如下所示:
for f in $(<f.txt)
do
for l in $(<l.txt)
do
echo "$f $l"
done
done
read -p "Press [enter] to continue..."
让f.txt
和l.txt
是如下所示的文件:
25
26
26.8
26.9
27
27.1
27.2
27.3
27.4
27.5
28
29
30
和
0
0.5
1
1.5
2
2.5
3
我期待两个由空格分隔的数字,我得到一个空格,然后似乎是第二个数字。它仅在外部循环的最后一次迭代上按预期工作。
作为初学者,无法找出为什么会发生这种情况是令人沮丧的。谁能指出我正确的方向?
编辑:出乎意料的是,DOS行结尾确实是问题所在 - 作为一个新手,我直接陷入其中。
我解析了我的输入文件以摆脱问题并得到了预期的输出:两个嵌套的循环打印两个用空格分隔的数字。我利用编辑来澄清:
预期产出
25 0
25 0.5
25 1
25 1.5
25 2
25 2.5
25 3
26 0
26 0.5
26 1
26 1.5
26 2
26 2.5
26 3
26.8 0
etc...
我愿意为进来的人留下话题 - 也讨论切普纳所说的话:
首先,永远不要使用这样的 for 循环;使用 while 循环和 read 命令从文件中读取。
首先,永远不要像这样使用for
循环;使用while
循环和read
命令从文件中读取。
while IFS= read -r f; do
...
done < f.txt
知道了这一点,这是一个"简单"的步骤,在每一步调用read
两次,每个步骤都从单独的文件描述符中读取。
while IFS= read -r f; IFS= read -r l <&3; do
echo "$f $l"
done < f.txt 3< l.txt
read
始终从标准输入读取,因此<&3
将文件描述符 3 重定向到此read
命令的标准输入。3<
打开l.txt
,用于读取文件描述符 3。
您的代码不会并行运行两次迭代;它会针对f.txt
中的每一行分别遍历所有l.txt
。(在数学上,嵌套循环计算的是f.txt
和l.txt
中值的叉积,而不是点积。