1 de agosto de 2009

Ejemplos de loops en Bash

Muchas veces el poco conocimiento acerca de la programación de shell scripts y el propio intérprete de comandos hace que hagamos el doble de trabajo para trabajos simples que se pueden resolver con un sencillo script.

Por tal motivo y con ánimo a conocer un poco más acerca de algún shell de Unix, veremos algunos ejemplos cuidadosamente explicados de como hacer loops en Bash (el shell sucesor del Bourne y escrito para el proyecto GNU).

'for loop' es una declaración del leguaje de programación de scripts Bash que permite ejecutar un loop repetidamente. Por ejemplo, para ejecutar una tarea o comando cinco veces puedes hacer algo como lo siguiente:

#!/bin/bash
for i in 1 2 3 4 5
do
echo "Welcome $i times"
done

En este tipo de loop se ve que los valores que tomará la variable i están especificados luego del in. El loop ejecuta una secuencia de comandos de cada uno de los miembros de la lista de items. Los miembros de la lista no tienen por que ser siempre números, se puede escribir algo así:

#!/bin/bash
for i in "Juan" "Pepe" "Jose"
do
echo "Welcome $i times"
done

O así también, combinando distintos tipos de datos:

#!/bin/bash
for i in "Juan" 1 "Jose" 2 "Pepe"
do
echo "Welcome $i times"
done

Ahora, si queremos especificar un rango de valores, podemos requerir los servicios del comando seq y combinarlo con el for loop de la siguiente forma:

#!/bin/bash
for i in $(seq 1 2 20)
do
echo "Welcome $i times"
done

De esta forma, el for se hace en una lista de elementos que devuelve el seq. Pero no puedo dejar el tema aquí si no explico brevemente el uso de este comando. La función de seq es básicamente imprimir un listado de números. seq recibe uno, dos o tres parámetros e imprime el listado desde el primero al último según un incremento dado (o no)

seq LAST
seq FIRST LAST
seq FIRST INCREMENT LAST

Por ejemplo:

$ seq 2
1
2
$ seq 2 6
2
3
4
5
6
$ seq 0 2 10
0
2
4
6
8
10
$

Volviendo al tema que nos compete, "for loops", veremos la sintaxis de tres expresiones, sintaxis que viene heredada del queridisimo C. Donde las tres expresiones utilizadas por el for representan, un inicializador, una condición de loop y un contador.

#!/bin/bash
for ((i=0;i<3;i++));
do
echo "Welcome $i times"
done

En el anterior ejemplo, se inicializa la variable i en 0, la misma se va incrementando en uno en cada pasada y el loop se realizará siempre y cuando i sea menor que tres.

Con esta estructura de control también se puede realizar un loop infinito, por ejemplo:

#!/bin/bash
for ((;;)); do
echo "infinite loops [ hit CTRL+C to stop]"
done

Para quienes vienen de C, también será facil de explicar con el siguiente ejemplo, el funcionamiento del break para salir del loop o el continue para forzar una continuación del loop:

for I in 1 2 3 4 5
do
statements1
statements2

if (disaster-condition)
then
break #Abandon the loop.
fi

if (condition)
then
continue #Go to next iteration of I in the loop and skip
fi

statements3
done

Finalizando y para no aburrirlos más, antes de que te pongas a escribir tus primeros for en bash, veremos que el uso del for también puede ser aplicado sobre un listado de archivos de un directorio. El siguiente scritp recorre los archivo guardados en el directorio /etc hasta encontrar el archivo resolv.conf

#!/bin/bash
for file in /etc/*
do
if [ "${file}" == "/etc/resolv.conf" ]
then
countNameservers=$(grep -c nameserver /etc/resolv.conf)
echo "Total ${countNameservers} nameservers defined in ${file}"
break
fi
done

Vía: mixCraft

0 comentarios:

 
Design by Wordpress Theme | Bloggerized by Free Blogger Templates | coupon codes