Uno de los errores más comunes cuando se aprende a utilizar los scripts “bash” bajo GNU/Linux para leer un archivo línea por línea,
es el utilizar un bucle “for”, (for line in $(cat file.txt); do ...) lo que conduce a una evaluación de cada palabra y no de cada
línea, que es lo que se busca.
Ejemplo de un bucle “for”:
for line in $(cat file.txt); do echo "$line" ; done
Esta
Es
La
Línea
n°
1
Esta
Es
La
Línea
n°
2
Esta
[...]La solución consiste en utilizar un bucle “while” asociado al comando interno “read”.
Sin embargo, también podemos obtener el mismo resultado con un bucle “for” con la condición de que cambiemos el valor de la
variable "$IFS" (Internal Field Separator, separador de campo interno) antes de ejecutar el bucle. Es lo que veremos a continuación.El bucle “while” sigue siendo el método más apropiado y simple para leer un archivo línea por línea.
while read linea
do
tar -cpzf $linea.tar.gz /home/$linea
done < archivo.txtSi bien es cierto que el bucle “while” es el método más simple, sin embargo este tiene un gran inconveniente, el de eliminar el
formateado de las líneas y especialmente los espacios y tabulaciones.
Felizmente el bucle “for” asociado a un cambio de IFS permite conservar la estructura del documento a la salida.
oldIFS=$IFS # conserva el separador de campo
IFS=$'\n' # nuevo separador de campo, el caracter fin de línea
for línea in $(cat archivo)
do
comando
done
IFS=$old_IFS # restablece el separador de campo predeterminado