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é readrestituisce 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 readpuò 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 <&3invece.)