Poniżej czytany jest plik przekazywany jako argument linia po linii:
while IFS= read -r line; do
echo "Text read from file: $line"
done < my_filename.txt
Jest to standardowa forma odczytu linii z pliku w pętli. Wyjaśnienie:
IFS=
(lub IFS=''
) zapobiega przycinaniu wiodących / końcowych białych znaków.
-r
zapobiega interpretacji ucieczek odwrotnego ukośnika.
Lub możesz umieścić go w skrypcie pomocniczym pliku bash, przykładowa zawartość:
#!/bin/bash
while IFS= read -r line; do
echo "Text read from file: $line"
done < "$1"
Jeśli powyższe zapisano w skrypcie z nazwą pliku readfile
, można go uruchomić w następujący sposób:
chmod +x readfile
./readfile filename.txt
Jeśli plik nie jest standardowym plikiem tekstowym POSIX (= nie zakończony znakiem nowej linii), można zmodyfikować pętlę, aby obsługiwała końcowe wiersze częściowe:
while IFS= read -r line || [[ -n "$line" ]]; do
echo "Text read from file: $line"
done < "$1"
Tutaj || [[ -n $line ]]
zapobiega ignorowaniu ostatniego wiersza, jeśli nie kończy się on na \n
(ponieważ read
zwraca niezerowy kod wyjścia, gdy napotka EOF).
Jeśli polecenia wewnątrz pętli również odczytują ze standardowego wejścia, read
można użyć innego deskryptora pliku do czegoś innego (unikaj standardowych deskryptorów plików ), np .:
while IFS= read -r -u3 line; do
echo "Text read from file: $line"
done 3< "$1"
(Powłoki inne niż Bash mogą nie wiedzieć read -u3
; użyj read <&3
zamiast tego.)