В bash оба цикла нужны, но для разных задач. Путаница между ними - источник проблем.
▪️ for - перебор готового списка. Используй, когда список уже есть.
for f in *.log; do
echo "$f"
done
файлы;
аргументы "$@";
элементы массива.
⚠️ Пример ошибок:
for f in $(ls *.log); do # ломается на пробелах
▪️ while - поток данных. Идеален для чтения ввода.
while IFS= read -r line; do
echo "$line"
done < file.txt
строки с пробелами;
вывод команд;
большие файлы.
⚠️ Частая ошибка:
cat file | while read line; do
count=$((count+1)) # переменная пропадёт
done
(цикл в subshell!)
for не является универсальным, а while безопаснее для данных. Перед созданием цикла нужно задавать себе вопрос: список или поток.BashTex 📱 #bash