Lo siguiente lee un archivo pasado como argumento línea por línea:
while IFS= read -r line; do
echo "Text read from file: $line"
done < my_filename.txt
Esta es la forma estándar para leer líneas de un archivo en un bucle. Explicación:
IFS=
(o IFS=''
) evita que se recorten los espacios en blanco iniciales / finales.
-r
evita que se interpreten los escapes de barra invertida.
O puede ponerlo en un script de ayuda de archivo bash, contenido de ejemplo:
#!/bin/bash
while IFS= read -r line; do
echo "Text read from file: $line"
done < "$1"
Si lo anterior se guarda en un script con nombre de archivo readfile
, se puede ejecutar de la siguiente manera:
chmod +x readfile
./readfile filename.txt
Si el archivo no es un archivo de texto POSIX estándar (= no terminado por un carácter de nueva línea), el bucle puede modificarse para manejar líneas parciales finales:
while IFS= read -r line || [[ -n "$line" ]]; do
echo "Text read from file: $line"
done < "$1"
Aquí, || [[ -n $line ]]
evita que se ignore la última línea si no termina con un \n
(ya queread
devuelve un código de salida distinto de cero cuando encuentra EOF).
Si los comandos dentro del bucle también se leen desde la entrada estándar, el descriptor de archivo utilizado por se read
puede cambiar a otra cosa (evite los descriptores de archivo estándar ), por ejemplo:
while IFS= read -r -u3 line; do
echo "Text read from file: $line"
done 3< "$1"
(Los shells que no son Bash pueden no saberlo read -u3
; en su read <&3
lugar, úselos)