Loops 内环超过最大索引值

Loops 内环超过最大索引值,loops,for-loop,nested-loops,carriage-return,Loops,For Loop,Nested Loops,Carriage Return,我正在命令行上运行一些代码,这些代码应该在双嵌套循环中执行一些简单的代码,以及一些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 令我大吃一惊的是,我看到内环索

我正在命令行上运行一些代码,这些代码应该在双嵌套循环中执行一些简单的代码,以及一些
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中的嵌套循环是否不像我认为的那样工作?

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

有许多简单的修复方法:

  • \r
    替换为
    \n
    ,尽管这将不再产生更新单行输出的所需行为
  • 打印前清除每行,
    printf”\r[许多空格]\r$i-$j
  • 以固定宽度打印数字(左填充零):
    printf“\r%03d-%03d”$i$j

  • 我简单地运行了2个for循环并简单地打印了文本,这对我来说很好,你的脚本中有控制M个字符吗?你能通过执行
    cat-v输入文件检查一下吗?
    ?啊,我发现它几乎正确,也看到了我的答案:)干杯。