Estructuras de control 1 Las estructuras de control son instrucciones que incluyen comans en bloque para el control del flujo del script o programa. Las estructuras disponibles cuan programamos en shell son: if, case, for, while y until. Estructura de control condicional: if El coman if, implementa una estructura condicional nde, si se cumple una condición, entonces se ejecuta un bloque de comans. Su algoritmo es el siguiente: SI condición ES CIERTA ENTONCES coman1 coman2 SI NO comanm comanm+1 FIN DE BLOQUE En la estructura if del shell, el final del bloque se indica con la palabra fi (if al revés), y su sintaxis es: if expresión coman1 coman2 [else comanm comanm+1 ] fi O, también, en una sola línea: if expresión ; comans ; [else comansm ;] fi 1 La autora original de este cumento es la M. en I. Rosalía Mora Juárez, las actualizaciones al mismo fueron hechas por el M. en C. Sergio Rogelio Tinoco Martínez. R. M. J. y S. R. T. M. FIE 2013 [1]
Si expresión finaliza exitosamente (es decir, devuelve 0), se ejecutan los comans entre y else. Si expresión devuelve un número distinto de cero, se ejecutan los comans entre else y fi. También es váli escribir expresión entre corchetes; se obtiene el mismo resulta. Ejemplos: MENSAJE=Hola if [ $MENSAJE = Hola ] echo $MENSAJE fi # ciertofalso.sh: Escribe cierto o falso según el parámetro del usuario. if [ $1 = "0" ] echo "Cierto: El parámetro introduci fue 0." else echo "Falso: El parámetro introduci no es 0." fi Ejercicio: Modifica el script ciertofalso.sh para que pregunte la edad del usuario y si ésta es > 18 muestre el mensaje Mayor de edad ; en caso contrario que indique Menor de edad. La estructura condicional if else también puede manejar más de s condiciones: if expresión1 coman1 coman2 [elif expresión2 comanm comanm+1 [elif expresión3 comann comann+1 [else comanz comanz+1 ]]] fi Ejemplo: R. M. J. y S. R. T. M. FIE 2013 [2]
# califica.sh: Determina la calificación con letra de un valor numérico [0-100]. if [ $1 -ge 90 ] echo "Calificación: Obtuvo una A." elif [ $1 -ge 80 ] echo "Calificación: Obtuvo una B." elif [ $1 -ge 70 ] echo "Calificación: Obtuvo una C." elif [ $1 -ge 60 ] echo "Calificación: Obtuvo una D." else # La calificación es menor de 60 echo "Calificación: Obtuvo una F." fi Estructura de control condicional: case El coman case implementa alternativas o casos. Es una forma más natural de implementar una instrucción ifelif--else. Se utiliza para condiciones tipo opción múltiple, en nde se elige de entre múltiples secuencias de comans, la secuencia a ejecutar. La elección se realiza encontran el primer patrón con el que empata una cadena de caracteres. El algoritmo para la instrucción case es: EN CASO DE QUE valor COINCIDA CON patrón1) coman1.1; coman1.n;; patrón2) coman2.1; coman2.n;; EN OTRO CASO) comann FIN La sintaxis para case es: case $CADENA in patrón1) comans1;; patrón2) comans2;; *) comansn;; esac R. M. J. y S. R. T. M. FIE 2013 [3]
case verifica si $CADENA cumple con alguno de los patrones (patrón1 o patrón2) y ejecuta los comans asocias con la primer coincidencia que encuentra. Escribir ;; sirve para delimitar cada bloque de comans, y esac (case al revés) indica el final de la instrucción case. Nótese que el patrón * se coloca al final, ya que empata con cualquier cadena y permite ejecutar comansn cuan ninguna de las opciones anteriores fue satisfecha. Ejemplos: # diasemana.sh: Indica el día de la semana correspondiente a un número da. case $1 in 0) echo Domingo;; 1) echo Lunes;; 2) echo Martes;; 3) echo Miércoles;; 4) echo Jueves;; 5) echo Viernes;; 6) echo Sába;; *) echo Debes indicar un número del 0 al 6;; esac El siguiente ejemplo utiliza parámetros y la expresión lógica OR. # estacion.sh: Indica la estación del año según el mes da. case $1 in diciembre enero febrero) echo Invierno;; marzo abril mayo) echo Primavera;; junio julio agosto) echo Verano;; septiembre octubre noviembre) echo Otoño;; *) echo estacion.sh debe invocarse como: estacion.sh mes echo Con el nombre del mes en minúsculas;; esac El parámetro $1 se recibe de la línea de comans. La opción *) empata con cualquier cadena, por lo que actúa como en otro caso, y es útil para dar instrucciones sobre el empleo del coman. El símbolo actúa como una operación lógica OR (o). Pueden usarse también los comodines * y?. Ejercicio: Investiga cómo podría modificarse el script anterior para que acepte el mes en cualquier combinación de mayúsculas y minúsculas. R. M. J. y S. R. T. M. FIE 2013 [4]
Estructura de control de repetición: for El coman for es una estructura repetitiva, en la cual una secuencia de comans se ejecuta una cantidad determinada de veces, según se indique. A este tipo de estructuras se les conoce como ciclos. El algoritmo para for es: PARA variable CON valor1 valor2... valorn HACER coman1 coman2 comann HECHO Nótese que variable tendrá cada uno de los valores: valor1, valor2,, valorn. En el ciclo los comans se ejecutan con el valor que tenga variable, tantas veces como posibles valores se tengan. La sintaxis para for es: for variable in lista_de_valores comans O, también, en una sola línea: for variable in lista_de_valores ; comans ; Ejemplos: 1. Se puede probar la instrucción for en la línea de comans, con los ejemplos siguientes: for LETRA in a b c d ; echo $LETRA ; for NOMBRE in alfa beta gamma ; echo $NOMBRE ; for ARCHIVO in * ; echo Nombre del archivo $ARCHIVO ; Nótese que en el último ejemplo, el caracter * es expandi por el shell, colocan en su lugar tos los nombres de archivo del directorio actual. 2. El ejemplo siguiente es un script de shell que presenta una serie de números. # ciclo_for_simple1.sh: Genera la serie de numeros enteros del 1 al 9 for numeros in 1 2 3 4 5 6 7 8 9 echo -n "$numeros " echo R. M. J. y S. R. T. M. FIE 2013 [5]
3. En el script siguiente contar_archivos.sh, se incluye el coman expr para calcular expresiones aritméticas. # contar_archivos.sh: Muestra los nombres de los archivos en el directorio # actual y los cuenta. CUENTA=0 for ARCHIVO in * echo $ARCHIVO CUENTA=`expr $CUENTA + 1` # incrementa CUENTA en 1 echo Hay $CUENTA archivos en el directorio `pwd` Ejercicios: 1. Prueba el script de shell ciclo_for_simple2.sh e indica por qué no presenta el mismo comportamiento del script ciclo_for_simple1.sh. # ciclo_for_simple2.sh: Presenta una serie de numeros for numeros in "1 2 3 4 5 6 7 8 9" echo $numeros 2. Modifica el script siguiente, para que muestre la lista de palabras que proporcione el usuario. # listapalabras.sh: Muestra palabras de una lista dada. LISTA="silla mesa banco cuadro armario" for ELEMENTO in $LISTA echo $ELEMENTO Estructura de control de repetición: while El coman while implementa una estructura repetitiva en la cual el conjunto de comans se ejecuta mientras se mantenga válida una condición (while = mientras). La condición se examina al principio del ciclo y luego cada vez que se completa la secuencia de comans. Si la condición es falsa desde la primera vez, los comans no se ejecutan nunca. Por su característica de repetitividad, al while se le considera como una estructura de ciclo. El algoritmo para while es: R. M. J. y S. R. T. M. FIE 2013 [6]
MIENTRAS condición HACER coman1 comann HECHO Y su sintaxis es: while condición coman1 comann O, bien, en una sola línea: while condición ; comans ; Ejemplo: # ciclo_while_simple.sh VAR=0 LIMITE=10 while [ "$VAR" -lt "$LIMITE" ] # ^ ^ # Es importante dejar estos espacios, para que se ejecute el coman test echo -n "$VAR " # Con n, el coman echo omite el salto de línea final VAR=`expr $VAR + 1` Nótese que en el ejemplo se usa el operar -lt, "lower than", que significa "menor que". Observa su sintaxis, sobre to la posición de los espacios en blanco, que son obligatorios. Da que en el ejemplo se utiliza echo sin salto de línea (-n), la salida que se obtiene será de la forma: 0 1 2 3 4 5 6 7 8 9 Como observamos en el script anterior, la expresión entre corchetes es una forma de invocar al coman test, que realiza una prueba devolvien cierto o falso. Veamos el siguiente script: R. M. J. y S. R. T. M. FIE 2013 [7]
# crea_archivos.sh: Crea los archivos arch1 arch9, los lista y luego borra. VAL=1 while [ $VAL -lt 10 ] # mientras $VAL < 10 echo Crean el archivo arch$val touch arch$val VAL=`expr $VAL + 1` ls -l arch[0-9] # Listar los archivos creas rm arch[0-9] # Y ahora borrarlos echo El ejemplo usa el operar -lt, también, así como el coman touch para crear archivos vacíos. Ejercicios: 1. Probar el script anterior (ciclo_while_simple.sh) cambian la línea VAR=`expr $VAR + 1` con cada una de las expresiones equivalentes que a continuación se enlistan: a) VAR=$(($VAR+1)) b) VAR=$((VAR + 1)) c) let "VAR += 1" Verifica cuál es el comportamiento del script, y si cambia en algo el resulta después de ejecutarlo. Estructura de control de repetición: until El coman until implementa una estructura repetitiva en la cual el conjunto de comans se ejecuta hasta que se cumpla una condición. En cuanto la condición se cumple, dejan de ejecutarse los comans. La condición se examina al principio: Si es verdadera, los comans no se ejecutan (notar la diferencia con while). until también es una estructura de tipo ciclo. Su algoritmo es: HASTA condición HACER coman1 comann HECHO R. M. J. y S. R. T. M. FIE 2013 [8]
Y su sintaxis es: until [ condición ] coman1 comann O, bien, en una sola línea: until condición ; comans ; Ejemplos: # ciclo_until_simple.sh VAR=0 LIMITE=10 until [ "$VAR" -ge "$LIMITE" ] # ^ ^ # Es importante dejar estos espacios, porque hacen que se ejecute el coman test echo -n "$VAR " # Con n, el coman echo omite el salto de línea final VAR=`expr $VAR + 1` echo Nótese que el ejemplo usa el operar -ge, que significa greater than, mayor o igual que. Observa su sintaxis, sobre to la posición de los espacios en blanco, que son obligatorios. Da que en el ejemplo se utiliza echo sin salto de línea (-n), la salida que se obtiene será de la forma: 0 1 2 3 4 5 6 7 8 9 El script crear_archivos_until.sh hace lo mismo que crear_archivos.sh, pero emplean until en lugar de while. # crea_archivos_until.sh: Crea los archivos arch1 arch9, los lista y borra. VAL=1 until [ $VAL -eq 10 ] # Hasta que $VAL = 10 echo Crean archivo arch$val touch arch$val VAL=`expr $VAL + 1` ls -l arch[0-9] rm arch[0-9] R. M. J. y S. R. T. M. FIE 2013 [9]
Ejercicio: Prueba el siguiente script. Indica qué es lo que hace. Modifica el script incluyen dentro una estructura case (Tip: Cambia el nombre de las variables a español). # mistery.sh END_CONDITION="end" until [ "$var1" = "$END_CONDITION" ] # Tests condition echo "Input variable " echo "($END_CONDITION to exit)" read var1 echo "variable #1 = $var1" echo Complementos de las estructuras de control: break y continue Para forzar la salida en un bloque de comans presentes en las estructuras case, while o until, se utiliza el coman break. break provoca una ruptura del ciclo, es decir, indica al intérprete de comans que se salte al primer coman que sigue del ciclo, aunque el coman actual (el que está ejecutánse) aún no haya termina. break La sintaxis es: El coman continue indica al intérprete de comans que se salte al valor siguiente de la lista o condición, ignoran el resto de comans que haya por debajo. La sintaxis es: continue Ejercicio: Crea un script que presente el menú de opciones siguiente (y la respuesta indicada): Cuál es tu sistema operativo favorito? 1) GNU/Linux. 2) GNU/Hurd. 3) Free BSD. 4) Otros.? 1 Has selecciona GNU/Linux. R. M. J. y S. R. T. M. FIE 2013 [10]
Coman exit El coman exit se utiliza para terminar inmediatamente un script y volver al shell original. La sintaxis es: exit Si aparece en una línea del script, termina inmediatamente el script; si se escribe directamente en la línea de comans de la terminal, terminará la ejecución del shell actual y, por lo tanto, la sesión de GNU/Linux. Ejemplos: 1) Este ejemplo termina el script, devolvien el número indica, lo que puede usarse para determinar condiciones de error. exit 6 2) Este otro ejemplo, termina el script devolvien 0, para indicar la finalización exitosa de la tarea. Escribir solamente exit, también devuelve el código de error 0. exit 0 Ejercicio: Probar el script siguiente uso_exit.sh (Tip: Tiene algunos errores que debes encontrar y corregir). # uso_exit.sh: Prueba valores devueltos por exit. echo "Prueba de valores devueltos por exit al invocar con parámetros." echo "En esta prueba se obtiene: bien, error1, error2, cualquier cosa o nada" echo echo "Verificar ahora el valor devuelto con:" echo ' echo $?' echo VALOR=$1 case $VALOR in bien) echo " -> Terminación sin error" ; exit 0;; error1) echo " -> Terminación con error 1" ; exit 1;; error2) echo " -> Terminación con error 2" ; exit 2;; *) echo " -> Terminación con error 3." echo "Parámetro no previsto o no hay parámetro" exit 3;; esac $? proporciona a exit el esta del último coman ejecuta durante la invocación del script. R. M. J. y S. R. T. M. FIE 2013 [11]
En resumen: while es una estructura de control de tipo ciclo que se utiliza para ejecutar un grupo de comans mientras se cumpla una condición. until es una estructura de control de tipo ciclo, y se utiliza para ejecutar un grupo de comans mientras una condición sea falsa, o hasta que la condición sea verdadera. for también es una estructura de control de tipo ciclo, solo que ésta no se basa en el cumplimiento (o no) de alguna condición, sino en la repetición hasta que llega a un valor límite da. break y continue sirven para tomar el control de los ciclos y la ejecución de comans relacionas con éstos. Para terminar inmediatamente un script y volver al shell original se emplea el coman exit. R. M. J. y S. R. T. M. FIE 2013 [12]