Bash:嵌套在从文件中读取的计数器上的循环,带有十进制数字



我正在开始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.txtl.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.txtl.txt中值的叉积,而不是点积。

最新更新