estructuras de control - inicio | división de estudios de...

12
Laboratorio de herramientas computacionales R. M. J. y S. R. T. M. FIE 2013 [1] Estructuras de control 1 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.

Upload: dangmien

Post on 01-Oct-2018

219 views

Category:

Documents


0 download

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.