Сегодня разберём, чем отличаются различные циклы при работе с файлами.
#!/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 сначала вычисляет/считывает все значения для перебора в память, потом начинает с ними работать.
while (until) читает последовательно, по одному значению. Мало того, в данном случае цикл работает НЕ С ФАЙЛОМ НАПРЯМУЮ, а со stdin (куда мы перенаправляем файл), поэтому любое чтение stdin приводит к чтению записи файла. Результат вы видели.Продолжение следует…








Комментарии