我在命令行上运行一些代码,该代码应在双嵌套循环内执行一些简单的代码,并附带一些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中嵌套循环是否不能按照我认为的方式工作?
这里的问题与循环无关,而在于在\r
中使用printf
字符。打印并不会清除行,只是移回它的开头-因此,当您到达1-200
时,接下来的100条打印语句不会清除所有终端零,因此2-96
似乎是[C0 ]。换句话说,代码没有错,只是进度报告的方式。
有许多简单的解决方法:
2-960
替换\r
,尽管这将不再产生更新单行输出的预期行为\n
printf "\r[many spaces]\r$i-$j
当我运行以下代码(出于测试目的)时,恕我直言:
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