Story Transcript
Laboratorio de herramientas computacionales
Estructuras de control1 Las estructuras de control son instrucciones que incluyen comandos en bloque para el control del flujo del script o programa. Las estructuras disponibles cuando programamos en shell son: if, case, for, while y until.
Estructura de control condicional: if El comando if, implementa una estructura condicional donde, si se cumple una condición, entonces se ejecuta un bloque de comandos. Su algoritmo es el siguiente: SI condición ES CIERTA ENTONCES comando1 comando2 … SI NO comandoM comandoM+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 then comando1 comando2 … [else comandoM comandoM+1 …] fi
O, también, en una sola línea: if expresión ; then comandos ; [else comandosM ;] fi
1
La autora original de este documento 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]
Laboratorio de herramientas computacionales
Si expresión finaliza exitosamente (es decir, devuelve 0), se ejecutan los comandos entre then y else. Si expresión devuelve un número distinto de cero, se ejecutan los comandos entre else y fi. También es válido escribir expresión entre corchetes; se obtiene el mismo resultado. Ejemplos: #!/bin/bash clear MENSAJE=Hola if [ $MENSAJE = “Hola” ] then echo $MENSAJE fi #!/bin/bash # ciertofalso.sh: Escribe cierto o falso según el parámetro del usuario. clear if [ $1 = "0" ] then echo "Cierto: El parámetro introducido fue 0." else echo "Falso: El parámetro introducido 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 dos condiciones: if expresión1 then comando1 comando2 … [elif expresión2 then comandoM comandoM+1 … [elif expresión3 then comandoN comandoN+1 … … [else comandoZ comandoZ+1 …]]] fi
Ejemplo:
R. M. J. y S. R. T. M.
FIE 2013
[2]
Laboratorio de herramientas computacionales
#!/bin/bash # califica.sh: Determina la calificación con letra de un valor numérico [0-100]. clear if [ $1 -ge 90 ] then echo "Calificación: Obtuvo una A." elif [ $1 -ge 80 ] then echo "Calificación: Obtuvo una B." elif [ $1 -ge 70 ] then echo "Calificación: Obtuvo una C." elif [ $1 -ge 60 ] then 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 comando 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 donde se elige de entre múltiples secuencias de comandos, la secuencia a ejecutar. La elección se realiza encontrando 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) comando1.1; … comando1.N;; patrón2) comando2.1; … comando2.N;; … EN OTRO CASO) comandoN FIN
La sintaxis para case es: case $CADENA in patrón1) comandos1;; patrón2) comandos2;; *) comandosN;; esac
R. M. J. y S. R. T. M.
FIE 2013
[3]
Laboratorio de herramientas computacionales
case verifica si $CADENA cumple con alguno de los patrones (patrón1 o patrón2) y ejecuta los comandos asociados con la primer coincidencia que encuentra. Escribir ;; sirve para delimitar cada bloque de comandos, 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 comandosN cuando ninguna de las opciones anteriores fue satisfecha. Ejemplos: #!/bin/bash # diasemana.sh: Indica el día de la semana correspondiente a un número dado. clear 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ábado;; *) echo Debes indicar un número del 0 al 6;; esac
El siguiente ejemplo utiliza parámetros y la expresión lógica OR. #!/bin/bash # estacion.sh: Indica la estación del año según el mes dado. clear 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 echo Fin
El parámetro $1 se recibe de la línea de comandos. 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 comando. 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]
Laboratorio de herramientas computacionales
Estructura de control de repetición: for El comando for es una estructura repetitiva, en la cual una secuencia de comandos 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 comando1 comando2 … comandoN HECHO
Nótese que variable tendrá cada uno de los valores: valor1, valor2, …, valorN. En el ciclo los comandos 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 do comandos done
O, también, en una sola línea: for variable in lista_de_valores ; do comandos ; done
Ejemplos:
1. Se puede probar la instrucción for en la línea de comandos, con los ejemplos siguientes: for LETRA in a b c d ; do echo $LETRA ; done for NOMBRE in alfa beta gamma ; do echo $NOMBRE ; done for ARCHIVO in * ; do echo Nombre del archivo $ARCHIVO ; done
Nótese que en el último ejemplo, el caracter * es expandido por el shell, colocando en su lugar todos los nombres de archivo del directorio actual.
2. El ejemplo siguiente es un script de shell que presenta una serie de números. #!/bin/bash # ciclo_for_simple1.sh: Genera la serie de numeros enteros del 1 al 9 clear for numeros in 1 2 3 4 5 6 7 8 9 do echo -n "$numeros " done echo echo Fin
R. M. J. y S. R. T. M.
FIE 2013
[5]
Laboratorio de herramientas computacionales
3. En el script siguiente contar_archivos.sh, se incluye el comando expr para calcular expresiones aritméticas. #!/bin/bash # contar_archivos.sh: Muestra los nombres de los archivos en el directorio # actual y los cuenta. clear CUENTA=0 for ARCHIVO in * do echo $ARCHIVO CUENTA=`expr $CUENTA + 1` # incrementa CUENTA en 1 done echo Hay $CUENTA archivos en el directorio `pwd` echo Fin
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. #!/bin/bash # ciclo_for_simple2.sh: Presenta una serie de numeros clear for numeros in "1 2 3 4 5 6 7 8 9" do echo $numeros done
2. Modifica el script siguiente, para que muestre la lista de palabras que proporcione el usuario. #!/bin/bash # listapalabras.sh: Muestra palabras de una lista dada. clear LISTA="silla mesa banco cuadro armario" for ELEMENTO in $LISTA do echo $ELEMENTO done
Estructura de control de repetición: while El comando while implementa una estructura repetitiva en la cual el conjunto de comandos 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 comandos. Si la condición es falsa desde la primera vez, los comandos 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]
Laboratorio de herramientas computacionales
MIENTRAS condición HACER comando1 … comandoN HECHO
Y su sintaxis es: while condición do comando1 … comandoN done
O, bien, en una sola línea: while condición ; do comandos ; done
Ejemplo: #!/bin/bash # ciclo_while_simple.sh clear VAR=0 LIMITE=10 while [ "$VAR" -lt "$LIMITE" ] # ^ ^ # Es importante dejar estos espacios, para que se ejecute el comando test do echo -n "$VAR " # Con –n, el comando echo omite el salto de línea final VAR=`expr $VAR + 1` done echo Fin
Nótese que en el ejemplo se usa el operador -lt, "lower than", que significa "menor que". Observa su sintaxis, sobre todo la posición de los espacios en blanco, que son obligatorios. Dado 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 comando test, que realiza una prueba devolviendo cierto o falso. Veamos el siguiente script:
R. M. J. y S. R. T. M.
FIE 2013
[7]
Laboratorio de herramientas computacionales
#!/bin/bash # crea_archivos.sh: Crea los archivos arch1 … arch9, los lista y luego borra. clear VAL=1 while [ $VAL -lt 10 ] # mientras $VAL < 10 do echo Creando el archivo arch$VAL touch arch$VAL VAL=`expr $VAL + 1` done ls -l arch[0-9] # Listar los archivos creados rm arch[0-9] # Y ahora borrarlos echo echo Fin
El ejemplo usa el operador -lt, también, así como el comando touch para crear archivos vacíos.
Ejercicios:
1. Probar el script anterior (ciclo_while_simple.sh) cambiando 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 resultado después de ejecutarlo.
Estructura de control de repetición: until El comando until implementa una estructura repetitiva en la cual el conjunto de comandos se ejecuta hasta que se cumpla una condición. En cuanto la condición se cumple, dejan de ejecutarse los comandos. La condición se examina al principio: Si es verdadera, los comandos no se ejecutan (notar la diferencia con while). until también es una estructura de tipo ciclo. Su algoritmo es: HASTA condición HACER comando1 … comandoN HECHO
R. M. J. y S. R. T. M.
FIE 2013
[8]
Laboratorio de herramientas computacionales
Y su sintaxis es: until [ condición ] do comando1 … comandoN done
O, bien, en una sola línea: until condición ; do comandos ; done
Ejemplos: #!/bin/bash # ciclo_until_simple.sh clear VAR=0 LIMITE=10 until [ "$VAR" -ge "$LIMITE" ] # ^ ^ # Es importante dejar estos espacios, porque hacen que se ejecute el comando test do echo -n "$VAR " # Con –n, el comando echo omite el salto de línea final VAR=`expr $VAR + 1` done echo echo Fin
Nótese que el ejemplo usa el operador -ge, que significa “greater than”, “mayor o igual que”. Observa su sintaxis, sobre todo la posición de los espacios en blanco, que son obligatorios. Dado 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 empleando until en lugar de while. #!/bin/bash # crea_archivos_until.sh: Crea los archivos arch1 … arch9, los lista y borra. clear VAL=1 until [ $VAL -eq 10 ] # Hasta que $VAL = 10 do echo Creando archivo arch$VAL touch arch$VAL VAL=`expr $VAL + 1` done ls -l arch[0-9] rm arch[0-9] echo Fin
R. M. J. y S. R. T. M.
FIE 2013
[9]
Laboratorio de herramientas computacionales
Ejercicio: Prueba el siguiente script. Indica qué es lo que hace. Modifica el script incluyendo dentro una estructura case (Tip: Cambia el nombre de las variables a español). #!/bin/bash # mistery.sh END_CONDITION="end" until [ "$var1" = "$END_CONDITION" ] do echo "Input variable " echo "($END_CONDITION to exit)" read var1 echo "variable #1 = $var1" echo done
# Tests condition
Complementos de las estructuras de control: break y continue Para forzar la salida en un bloque de comandos presentes en las estructuras case, while o until, se utiliza el comando break. break provoca una ruptura del ciclo, es decir, indica al intérprete de comandos que se salte al primer comando que sigue del ciclo, aunque el comando actual (el que está ejecutándose) aún no haya terminado. La sintaxis es: break
El comando continue indica al intérprete de comandos que se salte al valor siguiente de la lista o condición, ignorando el resto de comandos 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) 2) 3) 4)
GNU/Linux. GNU/Hurd. Free BSD. Otros.
?1 Has seleccionado GNU/Linux. R. M. J. y S. R. T. M.
FIE 2013
[10]
Laboratorio de herramientas computacionales
Comando exit El comando 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 comandos 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, devolviendo el número indicado, lo que puede usarse para determinar condiciones de error. exit 6
2) Este otro ejemplo, termina el script devolviendo 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). #!/bin/bash # uso_exit.sh: Prueba valores devueltos por exit. clear echo echo echo echo echo echo
"Prueba de valores devueltos por exit al invocar con parámetros." "En esta prueba se obtiene: bien, error1, error2, cualquier cosa o nada" "Verificar ahora el valor devuelto con:" ' 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 echo Fin
$? proporciona a exit el estado del último comando ejecutado durante la invocación del script.
R. M. J. y S. R. T. M.
FIE 2013
[11]
Laboratorio de herramientas computacionales
En resumen: •
while es una estructura de control de tipo ciclo que se utiliza para ejecutar un grupo de comandos mientras se cumpla una condición.
•
until es una estructura de control de tipo ciclo, y se utiliza para ejecutar un grupo de comandos 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 dado.
•
break y continue sirven para tomar el control de los ciclos y la ejecución de comandos relacionados con éstos.
•
Para terminar inmediatamente un script y volver al shell original se emplea el comando exit.
R. M. J. y S. R. T. M.
FIE 2013
[12]