Quanto segue legge un file passato come argomento riga per riga:
while IFS= read -r line; do
echo "Text read from file: $line"
done < my_filename.txt
Questo è il modulo standard per leggere le righe da un file in un ciclo. Spiegazione:
IFS=
(o IFS=''
) impedisce di tagliare gli spazi iniziali / finali.
-r
impedisce l'interpretazione delle escape di backslash.
Oppure puoi metterlo in uno script helper di file bash, contenuto di esempio:
#!/bin/bash
while IFS= read -r line; do
echo "Text read from file: $line"
done < "$1"
Se quanto sopra viene salvato in uno script con nome file readfile
, può essere eseguito come segue:
chmod +x readfile
./readfile filename.txt
Se il file non è un file di testo POSIX standard (= non terminato da un carattere di nuova riga), il ciclo può essere modificato per gestire le righe parziali finali:
while IFS= read -r line || [[ -n "$line" ]]; do
echo "Text read from file: $line"
done < "$1"
Qui, || [[ -n $line ]]
impedisce che l'ultima riga venga ignorata se non termina con un \n
(poiché read
restituisce un codice di uscita diverso da zero quando incontra EOF).
Se i comandi all'interno del ciclo leggono anche dall'input standard, il descrittore di file utilizzato da read
può essere modificato in qualcos'altro (evitare i descrittori di file standard ), ad esempio:
while IFS= read -r -u3 line; do
echo "Text read from file: $line"
done 3< "$1"
(Le shell non Bash potrebbero non saperlo read -u3
; utilizzare read <&3
invece.)