While en Bash Scripting

27 Mar

Si se tratara de un curso de Bash Scripting todos estaríamos de acuerdo en que esta no es la forma correcta de empezar, por lo que esto no será tanto un manual sino una referencia, pero todos son bienvenidos a leerlo.

La sintaxis básica para un bucle con while en Bash Scripting es:

null   
while [ condicion ]
do
  comando_1
  comando_2
  ...
  comando_n
done

Se evalúa la condición y se ejecutan los comandos comando_1 a comando_n cada vez que la condición es verdadera.

Para quienes manejan el bucle for no habrán encontrado nada nuevo, pero hay diferencias significativas en cuanto a manejo de texto se refiere: Supongamos que contamos con un archivo de texto que contiene los departamentos de Colombia, necesitamos procesar ese archivo para ingresar esa información a una Base de Datos o cualquier otro caso de la vida real; veamos algo del archivo:

null   
...
Nariño
Norte de Santander
Putumayo
Quindío
...

Supongamos que el archivo se llama departamentos, si quisiéramos procesarlo con un for, tendríamos algo de este estilo:

null   
for i in `cat departamentos`
do
  echo $i
  # Procesamiento.
done

Pero este bucle también separa por espacios, entonces los valores que tomaría la variable $i serían: Nariño, Norte, de, Santander, Putumayo, Quindío. No es esto lo que necesitamos y por eso en este caso while es eficiente y for no:

null   
while read linea # "linea" es la variable.
do
  echo $linea
  # Procesamiento.
done < departamentos

En este caso ya no tendremos el problema de los espacios. Ahora supongamos que la lectura no se hace desde un archivo sino desde la salida estándar a partir de algún comando, tendremos el mismo problema con los espacios; supongamos que los departamentos no se encuentran en un archivo de texto, sino que cada uno de ellos es un archivo dentro de un directorio llamado departamentos, con un for haríamos lo siguiente:

null   
for i in `ls departamendos`
do
  echo $i
  # Procesamiento.
done

Con while debemos realizar la llamada un poco diferente:

null   
while read linea
do
  echo $linea
  # Procesamiento.
done < <(ls departamentos)

Así nos evitamos el problema de los espacios, y es que lo que queremos es procesar líneas, cuando necesitemos separar una línea por espacios usaremos for. En la última línea vemos el comando entre paréntesis “(” y precedido por “<“, eso debe ir obligatoriamente junto “<(“.

Veamos algunas otras formas válidas de usar while para obtener datos desde la salida estándar:

null   
while read linea
do
  echo $linea
  # Procesamiento.
done <<< $(ls departamentos)

Esta forma traerá todo el contenido al mismo tiempo, para alguien ha de ser útil.

null   
while read linea
do
  echo $linea
  # Procesamiento.
done <<< `ls departamentos`

Lo mismo que el anterior.

null   
while read linea
do
  echo $linea
  # Procesamiento.
done << EOF
`ls departamentos`
EOF
null   
while read linea
do
  echo $linea
  # Procesamiento.
done << EOF
$(ls departamentos)
EOF

Para quienes no se hayan dado cuenta, los dos últimos casos son casi idénticos pues podemos ejecutar un comando colocándolo entre comillas simples invertidas o $().

null   
ls departamentos | while read linea
do
  echo $linea
  # Procesamiento.
done

Esta última forma no requiere que utilicemos comillas simples invertidas o $() para llamar al comando pues no ha de asignarse a nada, el pipe “|” redirecciona la salida estándar al while, sin embargo esta forma crea una subshell que es donde se ejecutará el while, por lo que cualquier variable inicializada dentro del while no será visible al terminar éste.

Acerca del autor

Christian Gutierrez ha escrito 22 publicaciones en este blog.

Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why. – Anonymous Developer

3 Comentarios a “While en Bash Scripting”