Следующее читает файл, передаваемый в качестве аргумента построчно:
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
вместо этого.)