Сегодня разберём, чем отличаются различные циклы при работе с файлами.

#!/bin/bash
seq 1 5 >file.txt

for i in $(<file.txt);do
  echo $i
  read -p 'press ENTER'
done
echo ---
while read i;do
  echo $i
  read -p 'press ENTER'
done <file.txt
rm file.txt
#--

Сохраняем в файл loop3.sh.

chmod +x loop3.sh

Создаём файл из пяти нумерованных строк.

seq 1 5 > file.txt

Блок for: читаем файл и выводим построчно. После каждой строки жмём ENTER для продолжения.

Блок while — тело цикла один в один.

Запускаем: ./loop3.sh.

1
press ENTER
2
press ENTER
3
press ENTER
4
press ENTER
5
press ENTER
---
1
3
5

Часть строк второго цикла потерялась. ENTER нажимать никто не просил.

Все дело в том, что циклы работают принципиально по-разному.

Цикл for in сначала вычисляет/считывает все значения для перебора в память, потом начинает с ними работать.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Цикл while (until) читает последовательно, по одному значению. Мало того, в данном случае цикл работает НЕ С ФАЙЛОМ НАПРЯМУЮ, а со stdin (куда мы перенаправляем файл), поэтому любое чтение stdin приводит к чтению записи файла. Результат вы видели.

Продолжение следует…