内循环超过最大索引值

问题描述 投票:0回答:2

我在命令行上运行一些代码,该代码应在双嵌套循环内执行一些简单的代码,并附带一些printf -ing以跟踪我的进度:

for i in {1..180}; do for j in {1..200}; do
printf "$i-$j\r";
if [[ ! -f $dir/$i/$j/file0 ]] || [[ ! -f $dir/$i/$j/file1 ]]; then
echo $j >> $i.missing;
fi; done; done

令我惊讶的是,我看到内部循环索引$j远远超过200-我已经看到它高达960。这可能解释了为什么这段代码如此缓慢地运行。我不太确定自己在这里犯了什么错误-在bash中嵌套循环是否不能按照我认为的方式工作?

loops for-loop nested-loops carriage-return
2个回答
1
投票

这里的问题与循环无关,而在于在\r中使用printf字符。打印并不会清除行,只是移回它的开头-因此,当您到达1-200时,接下来的100条打印语句不会清除所有终端零,因此2-96似乎是[C0 ]。换句话说,代码没有错,只是进度报告的方式。

有许多简单的解决方法:

  1. 2-960替换\r,尽管这将不再产生更新单行输出的预期行为
  2. 打印前清除每一行,\n
  3. 以固定的宽度打印数字(左侧填充零):printf "\r[many spaces]\r$i-$j

0
投票

当我运行以下代码(出于测试目的)时,恕我直言:

printf "\r%03d-%03d" $i $j

上面运行得很好,我怀疑您的脚本具有控制M个字符,请执行一次for i in {1..180} do for j in {1..200} do printf "$i-$j\n"; done done 进行检查,如果不需要它们,请通过执行cat -v Input_file将其删除。另外,我不确定为什么您将不需要的tr -d '\r' < Input_file > temp && mv temp Input_file放在了printf中,所以那里需要\r或可能是引起它的:)

PS:添加链接以使SO知道\ r和\ n之间的差异\n

© www.soinside.com 2019 - 2024. All rights reserved.