jueves, 21 de octubre de 2010

Programación de scripts (parte 2)

En esta ocasión, vamos a ver cómo trabajar con instrucciones de control de flujo.

En cualquier lenguaje de programación, las instrucciones de control de flujo se encargan de evaluar el resultado de una instrucción y ejecutar el código correspondiente según dicho resultado.

Vamos a ver un ejemplo:

$ while true
> do
> echo "Bucle infinito"
> done

Al ejecutar este ejemplo voy a ver a continuación que se repite en forma infinita la cadena “Bucle infinito” hasta que ingrese la secuencia Ctrl-C. Noten que después de escribir “while true” el prompt cambia al caracter ‘>’, esto es porque hasta la instrucción “done” la instrucción esta incompleta.

Además del while contamos con otras instrucciones, las mas comunes son if, for y case.

Vamos a retomar el script del ejercicio anterior, si yo escribía mi nombre como parámetro me devuelve una cadena en la que incluye mi nombre, pero si no escribo el parámetro, simplemente no lo incluye en la cadena que devuelve, vamos a incluirle la condición de que escriba la cadena siempre y cuando el usuario haya escrito el parámetro:

#!/bin/ksh
#
# hola2
# Segunda corrección al script hola
# Revisa si por lo menos hay un parámetro
if test $# -gt 0
then
   echo Hola $1!
fi

Utilizamos la instrucción if para determinar si ejecutamos el comando echo, esto se va a decidir conforme a lo evaluado por la instrucción test. La instrucción test evalúa si la expresión dada es verdadera o no, si es verdadera, concluye con éxito, si no, lo hace con error. Una vez concluida dicha evaluación, if revisa si concluyo en forma correcta, en caso afirmativo, ejecuta todo lo que se encuentra entre la instrucción then y fi.


La instrucción if puede incluir un apartado else para ejecutar en caso de no se cumpla con la condición verdadera. Veamos el siguiente ejemplo:

#!/bin/ksh
#
# hola3
# Tercera corrección al script hola
# Revisa si por lo menos hay un parámetro
if test $# -gt 0
then
   echo "Hola $1!"
# de lo contrario
else
   echo "Escribe un parámetro"
fi

Aquí estoy utilizando else para indicarle que en el caso de que el usuario no escriba ningún parámetro escriba otra cadena solicitándolo.


Hasta ahora hemos visto como utilizar la instrucción test de una forma “canónica”, sin embargo, por lo regular se utiliza en la forma [ ], es decir, las condiciones a evaluar se encierran entre paréntesis rectangulares y ksh hace la sustitución, de esta forma nuestro código quedará más legible.


Vamos a corregir nuevamente nuestro ejemplo, por medio del if, elif y else vamos a evaluar si de mañana, tarde o noche y de acuerdo a eso haremos un saludo “mas apropiado”.

#!/bin/ksh
#
# hola4
# Cuarta corrección al script hola
# Revisa si no hay parámetros
if [ $# == 0 ]
then
        # entonces termina la ejecución
        echo "Escribe un parámetro"
        exit 1
fi
# Obtiene la hora actual entre 0 y 23
HORA=`date +%H`
# Si es entre las 3 de la madrugada y las 12 del día
if [ $HORA -gt 3 -a $HORA -lt 12 ]
then
        echo "Buenos días $1!"
# Si es entre las 12 de día y las 7 de la noche
elif [ $HORA -ge 12 -a $HORA -lt 19 ]
then
        echo "Buenas tardes $1!"
else
        echo "Buenas noches $1!"
fi

Analicemos esto:



En el primer if revisamos si el número de parámetros es igual a cero, es decir, que no se escribió ninguno, de ser cierto, escribimos un mensaje y concluimos la ejecución del script con la instrucción exit, la mejor práctica nos indica que si un script o cualquier programa en Unix concluye en forma incorrecta debe concluir con lo que se denomina “run level” diferente a cero, en este ejemplo le indicamos que concluya con 1.


Después de esto, definimos la variable HORA con la salida del comando date el cual, esta delimitado por acentos graves (`), en ksh, todo lo que se encuentra encerrado entre acentos graves se ejecuta y su salida se inserta en forma de cadena, es decir, suponiendo que son las 6 de la tarde y 3 minutos, el comando date +%H su salida es 18 el shell sustituye `date +%H` por 18 y a la variable HORA le asigna ese valor.


El script continua con un if, en el cual, se evalúa si el valor de HORA es mayor a 3 (-gt) y (-a) si es menor a 12 (-lt) en caso afirmativo da los buenos días, si no, si es mayor o igual a 12 (-ge) y (-a) menor a 19 (-lt) entonces da las buenas tardes, en caso contrario da las buenas noches, porque si no es mañana ni tarde, entonces debe ser noche.

No hay comentarios.: