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

时间:2018-03-23 15:08:50

标签: 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行的结尾确实是问题所在 - 作为一个新手我直接进入它。

我解析了我的输入文件以解决问题并得到了预期的输出:两个嵌套for循环打印两个用空格分隔的数字。我利用编辑的优势澄清:

预期产出

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...

我愿意为进来的人留下线索 - 也是为了讨论chepner所说的内容:

  

首先,永远不要使用像这样的循环;使用while循环和read命令从文件中读取。

1 个答案:

答案 0 :(得分:2)

首先,不要像这样使用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。

您的代码不会并行运行两次迭代;它会在l.txt中为每个行分别迭代所有f.txt。 (数学上,您的嵌套循环计算f.txtl.txt中值的叉积,而不是点积。)