我开始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行的结尾确实是问题所在 - 作为一个新手我直接进入它。
我解析了我的输入文件以解决问题并得到了预期的输出:两个嵌套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命令从文件中读取。
答案 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.txt
和l.txt
中值的叉积,而不是点积。)