Следующее читает файл, передаваемый в качестве аргумента построчно:
while IFS= read -r line; do
echo "Text read from file: $line"
done < my_filename.txt
Это стандартная форма для чтения строк из файла в цикле. Объяснение:
IFS=(или IFS='') предотвращает обрезку начальных / конечных пробелов.
-r предотвращает интерпретацию обратной косой черты.
Или вы можете поместить его в вспомогательный скрипт bash, пример содержимого:
#!/bin/bash
while IFS= read -r line; do
echo "Text read from file: $line"
done < "$1"
Если вышеперечисленное сохраняется в сценарии с именем файла readfile, его можно запустить следующим образом:
chmod +x readfile
./readfile filename.txt
Если файл не является стандартным текстовым файлом POSIX (= не завершается символом новой строки), цикл может быть изменен для обработки завершающих частичных строк:
while IFS= read -r line || [[ -n "$line" ]]; do
echo "Text read from file: $line"
done < "$1"
Здесь, || [[ -n $line ]]предотвращает игнорирование последней строки, если она не заканчивается на \n(поскольку readвозвращает ненулевой код завершения, когда она встречает EOF).
Если команды внутри цикла также считываются из стандартного ввода, используемый дескриптор файла readможет быть заменен чем-то другим (избегайте стандартных дескрипторов файлов ), например:
while IFS= read -r -u3 line; do
echo "Text read from file: $line"
done 3< "$1"
(Оболочки не Bash могут не знать read -u3; используйте read <&3вместо этого.)