estructuras de control - inicio | división de estudios de...
Post on 01-Oct-2018
221 Views
Preview:
TRANSCRIPT
Laboratorio de herramientas computacionales
R. M. J. y S. R. T. M. FIE 2013 [1]
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.
Laboratorio de herramientas computacionales
R. M. J. y S. R. T. M. FIE 2013 [2]
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:
Laboratorio de herramientas computacionales
R. M. J. y S. R. T. M. FIE 2013 [3]
#!/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 if-
elif-…-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
Laboratorio de herramientas computacionales
R. M. J. y S. R. T. M. FIE 2013 [4]
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.
Laboratorio de herramientas computacionales
R. M. J. y S. R. T. M. FIE 2013 [5]
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
Laboratorio de herramientas computacionales
R. M. J. y S. R. T. M. FIE 2013 [6]
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:
Laboratorio de herramientas computacionales
R. M. J. y S. R. T. M. FIE 2013 [7]
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:
Laboratorio de herramientas computacionales
R. M. J. y S. R. T. M. FIE 2013 [8]
#!/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
Laboratorio de herramientas computacionales
R. M. J. y S. R. T. M. FIE 2013 [9]
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
Laboratorio de herramientas computacionales
R. M. J. y S. R. T. M. FIE 2013 [10]
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" ] # Tests condition
do
echo "Input variable "
echo "($END_CONDITION to exit)"
read var1
echo "variable #1 = $var1"
echo
done
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) GNU/Linux.
2) GNU/Hurd.
3) Free BSD.
4) Otros.
? 1
Has seleccionado GNU/Linux.
Laboratorio de herramientas computacionales
R. M. J. y S. R. T. M. FIE 2013 [11]
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 "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
echo Fin
$? proporciona a exit el estado del último comando ejecutado durante la invocación del script.
Laboratorio de herramientas computacionales
R. M. J. y S. R. T. M. FIE 2013 [12]
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.
top related