Чтение файла строка за строкой в bash кажется простым… пока не начинают теряться символы.
▪️ Классическая ошибка
while read line; do
echo "$line"
done < file.txt
Проблемы:
\ - пропадаетначальные/конечные пробелы обрезаются
строки с
\n, \t, \\ читаются некорректноДля конфигов, путей и логов это критично.
▪️ Правильный способ
while IFS= read -r line; do
echo "$line"
done < file.txt
Это канонический вариант чтения строк.
▪️ Что здесь происходит
IFS=отключает разделение по пробелам и табам;
сохраняет все пробелы в начале и конце строки.
read -rзапрещает интерпретацию
\ как escape;строка читается как есть.
▪️ Пример проблемы
Файл:
path=C:\Program Files\App\
Без -r:
path=C:Program FilesApp
С IFS= read -r:
path=C:\Program Files\App\
▪️ Чтение с обработкой строк
while IFS= read -r line; do
[[ "$line" =~ ^#|^$ ]] && continue
echo "Обработка: $line"
done < config.conf
▪️ Альтернатива: mapfile
mapfile -t lines < file.txt
Но есть один минус -
mapfile загружает весь файл в памятьBashTex 📱 #bash #utils