Внутренний цикл превышает максимальное значение индекса - PullRequest
0 голосов
/ 13 октября 2019

Я запускаю некоторый код в командной строке, который должен выполнить некоторый простой код внутри двойного вложенного цикла, наряду с некоторым 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 не работают так, как я думаю?

1 Ответ

1 голос
/ 13 октября 2019

Проблема здесь не имеет ничего общего с циклами, но заключается в использовании символа \r в printf. Печать не очищает строку, а просто возвращается к ее началу - поэтому, когда вы достигнете 1-200, следующая сотня операторов печати не очистит все нули терминала, поэтому 2-96 выглядит как 2-960. Другими словами, в коде нет ничего плохого, только то, как сообщается о прогрессе.

Существует несколько простых исправлений:

  1. Замените \r на \nхотя это больше не приведет к желаемому поведению обновления одной строки вывода
  2. Очистите каждую строку перед печатью, printf "\r[many spaces]\r$i-$j
  3. Печать чисел с фиксированной шириной (заполнение слева нулями). ): printf "\r%03d-%03d" $i $j
...