A menudo necesitamos leer archivos en medio de nuestros scripts Bash, para procesar su contenido. Muchas veces nos basta con usar las comillas francesas y el comando cat dentro de un bucle, algo similar a:
for VBLE in cat ARCHIVO
do
# Hacer algo con $VBLE
done
El problema aparece cuando el archivo es muy grande, y el contenido supera el buffer que Bash destina a la línea de argumentos de los comandos (espacio reservado para el argv de la función Main en C, por simplificar mucho). Otras veces tropezamos con esta limitación al usar comodines en los comandos como ls, chmod, rm, etc, dentro de directorios que tienen muchos archivos, a lo que el intérprete de comandos nos responde con un mensaje que nos viene a decir que la línea de argumentos es demasiado larga. En estos casos podemos salir con el uso del comando find y el argumento -exec, pero cuando trabajamos con el contenido de ficheros, esta solución no nos sirve.
Por suerte el intérprete Bash contempla esta posibilidad y nos proporciona de comandos específicos para poder procesar archivos de forma secuencial, como siempre hemos hecho. El esquema es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#!/bin/bash # Abrir el archivo para lectura # El 8 representa el numero de descriptor asociado al fichero exec 8< motor.txt # Bucle para leer todo el contenido # Cada iteracion lee una linea del archivo y la deja en VBLE while read -u 8 VBLE do # Hacer algo con $VBLE echo $VBLE done # Cerrar el fichero exec 8<&- |