You are on page 1of 7

Actividad 15: Scripts III. Estructuras de control.

Introduccin -----------Como cualquier lenguaje de programacin, un script es capaz de decidir las acciones a tomar segn el resultado de operaciones anteriores. Tambin ofrece la posibilidad de repetir rdenes, ya sea un nmero fijo de veces, o hasta el cumplimiento de alguna condicin. Estados de salida ----------------Puesto que la funcin principal del intrprete de comandos es llamar a otros programas, resulta natural desear controlar la secuencia de ejecucin dentro de un script conforme al estado de salida de procesos anteriores. Para lograr esto, cada programa al finalizar devuelve un cdigo al sistema sealando si acab de forma exitosa (cero) o si existi algn error (nmero distinto de 0). Siempre que el shell necesita tomar una decisin basada en el resultado de otros programas, considera como 'cierto' a un valor 0 y como 'falso' a cualquier otro. El valor del estado de salida de una orden se obtiene con $?: #comando_a_ejecutar_y_sus_parmetros #echo $? --- ('0' verdadero y '1' falso) --Operadores ---------los operadores son los encargado de determinar si llevar a cabo una sentencia o conjunto de sentencias asociadas. Tal decisin acaba expresndose como un valor binario, es decir, 'cierto' o 'falso'. Pueden agruparse segn el tipo de operador: Operadores Booleanos && || ! <-- Equivale a una "AND" lgica. Accin1 Y Accin2 <-- Equivale a una "OR" lgica. Accin1 O Accin 2 <-- Equivale a una "NOT" lgica. Cambiar Resultado Accin

Operadores de test ( "[") + Test de ficheros -d nombre_de_directorio <- verdadero si es directorio -f nombre_de_fichero <- verdadero si es fichero -L nombre_de_enlace_simblico <- verdadero si es enlace simblico -x nombre_de_fich_ejecutable <- verdadero si es ejecutable -s nombre_de_fichero <- verdadero si existe y con datos fich1 -nt fich2 <- verdadero si fich1 es ms reciente que fich2 fich1 -ot fich2 <- verdadero si fich1 es ms antiguo que fich2 + Test de cadenas cadena1 = cadena2 cadena1 != cadena2 -z cadena <- verdadero si cadena1 es igual a cadena2 <- verdadero si cadena2 es distinta a cadena2 <- verdadero si cadena tiene longitud cero

+ Test n1 -eq n1 -ne n1 -gt n1 -ge n1 -lt n1 -le

numrico n2 n2 n2 n2 n2 n2

<<<<<<-

verdadero verdadero verdadero verdadero verdadero verdadero

si si si si si si

n1 n1 n1 n1 n1 n1

y n2 son y n2 son es mayor es mayor es menor es menor

iguales distintos que n2 o igual que n2 que n2 o igual que n2

+ Combinando o negando test test1 -a test2 test1 -o test2 !test <- verdadero si el test1 y el test2 son ciertos <- verdadero si el test1 o el test2 son ciertos <- valor negado del test

Es posible ver el resultado de la aplicacin de los operadores, igual que en el apartado anterior con "echo $?". Los operadores booleanos pueden combinar los resultados de varias pruebas. En particular, '&&' y '||' evalan sus argumentos de izquierda a derecha, detenindose cuando se sabe el resultado total. Esto ayuda a efectuar combinaciones de control sencillas. El operador '!' invierte el sentido del valor de retorno de un programa. Estos operadores encadenan comandos, en particular aquellos en los que interesa conocer el estado de retorno de un programa. Por ejemplo: #com_A && com_B Ejecutar el com_B si el com_A termin correctamente. #com_B || com_B Concatena la ejecucin de com_A y com_B siempre. #!comando Si comando entrega tras su ejecucin verdadero con esta orden dicho valor es el contrario. El comando interno 'test' evala un expresin booleana simple formada por cadenas y nmeros, entregando como valor de retorno el resultado de la aplicacin del operador correspondiente. '0' verdadero y '1' falso. Por ejemplo: #test 10 -lt 5 <-- 10 es menor que 5? #echo $? <-- presenta resultado 1 <-- falso # _ #test -z "" #echo $? 0 # _ <-- Es una cadena de 0 caracteres? <-- presenta resultado <-- verdadero

El comando 'test' tiene una representacin alternativa con "[" til en sentencias condicionales y bucles. Con este atajo debe incluirse "]" al final del argumento para sealar el lmite de la expresin booleana. Estas consultas equivalen a las anteriores: #[ 10 -lt 5 ] #echo $? 1 <-- Recuerda: hay que respetar los espacios en blanco para considerar la sintaxis correcta.

# _ #[ -z "" ] #echo $? 0 # _ Tambin existen los comandos internos 'true' y 'false' cuya funcin consiste simplemente en entregar al sistema el cdigo de terminacin '0' en el primer caso y '1' en el segundo: #true #echo #? 0 # _ #false #echo #? 1 # _ Estructuras de control ---------------------Hasta ahora es lgico pensar que un script ejecuta siempre el conjunto de sus tareas de forma secuencial puesto que son lanzadas una detrs de otra todas las acciones que almacena. Sin embargo existen herramientas cuyo propsito es romper esta linealidad y definen un orden diferente de ejecucin. Estas herramientas pueden encontrarse en cualquier lenguaje de programacin de alto nivel y son denominadas genricamente "estructuras de control" porque representan un patrn de ejecucin para un subconjunto de acciones. Las estructuras de control en un script son: - Estructura secuencial: Ya conocida, basada en el lanzamiento de una tarea tras otra. - Estructura condicional: Un grupo acciones se ejecutar si se cumple una condicin. - Estructura iterativa: Permite repetir una o varias rdenes segn un determinado criterio. Estructuras condicionales ------------------------Las estructuras condicionales son las encargadas de decidir si se realiza una accin o no; esta decisin se toma evaluando una expresin. Hay 4 variantes de estructura condicional: - condicional simple: si (expresin) entonces (rdenes) - condicional doble: si (expr) entonces (rds_si) sino ( rds_no) - condicional mltiple: si (Ex_A) entonces (Or_A) sino si (Ex_B) entonces (Or_B)... sino si Ex_x) entonces (Or_x)

- seleccin de tarea segn condicin: segn (expresin) en caso A (rdenesA) en caso B (rdenesB)... en caso X (rdenesX) Donde "rdenes" son acciones que el intrprete de comandos efectuar siempre que "Expresin" entregue como resultado un valor "verdadero". Una variante de la condicional mltiple es la seleccin de tareas segn condicin, donde se apuntan las tareas a ejecutar en funcin del valor de una expresin no booleana. A continuacin se muestra la sintaxis aceptada por el intrprete acompaada de un ejemplo: Condicional simple: if [ expresin ]; then cdigo_si_expresin_verdad fi Ejemplo "sc_if1.sh", necesita dos parmetros en la llamada: #! /bin/sh if [ $1 -eq $2 ]; then echo los parAmetros son iguales fi echo fin Condicional doble: if [ expresin ]; then cdigo_si_expresin_verdad else cdigo_si_expresin_falso fi Ejemplo "sc_if2.sh", necesita dos parmetros en la llamada: #! /bin/sh if [ $1 -eq $2 ]; then echo los parAmetros son iguales echo valor $1 else echo los parAmetros son distintos echo primer parAmetro: $1 echo segundo parAmetro: $2 fi Condicional mltiple: if [ expresin1 ]; then cdigo_si_expresin1_verdad elif [expresin2 ]; then cdigo_si_expresin2_verdad ...

elif [expresinN ] ; then cdigo_si_expresinN_verdad else # cdigo_si_expresiones1..N_falso # opcional fi Ejemplo "sc_if3.sh", necesita dos parmetros en la llamada: #! /bin/sh if[ $1 -eq $2 ]; then echo los parAmetros son iguales echo valor: $1 elif[ $1 -gt $2]; then echo el primer parAmetro es mayor que el segundo echo valor: $1 elif[ $1 -lt $2 ]; then echo el segundo parAmetro es mayor que el primero echo valor: $2 fi Seleccin segn condicin: case _cadena_ in expresin1) cdigo_si_cadena_igual_a_expresin1 ;; expresin2) cdigo_si_cadena_igual_a_expresin2 ;; ... expresinN) cdigo_si_cadena_igual_a_expresinN ;; *) cdigo_cuando_cadena_tiene_otros_valores esac Ejemplo "sc_if4.sh" sin parmetros: #! /bin/sh echo pulsa una tecla por favor... read tecla # Pide al usuario un valor que guardar en "tecla" case $tecla in # toma el contenido de la varible "tecla" [aeiou]) echo ha pulsado una vocal ;; [bcdfghjklmnpqrtvwxyz]) # vale cualquiera de estos caracteres echo ha pulsado una consonante ;; [A-Z]) # rango de caracteres desde 'A' hasta 'Z'. echo ha pulsado una letra mayUscula ;; [0-9]) echo ha pulsado un nUmero ;; *)

echo ha pulsado algo distinto a letra O nUmero ;; esac Estructuras iterativas ---------------------Adems de poder elegir entre varias opciones, el shell nos permite repetir una secuencia de mandatos un cierto nmero de veces, ya sea fijo o determinado por el cumplimiento de una condicin en base a una expresin booleana. Hay 3 frmulas de repeticin distintas: - Bucle repetir_HASTA_cumplir_condicin ("until"): repetir (rdenes) hasta (expresin) - Bucle repetir_MIENTRAS_se_cumpla_condicin ("while"): mientras (expresin) repetir - Bucle repetir_PARA_un_rango_de_valores ("for"): para (expresin segn rango) hacer (rdenes) A continuacin se muestra la sintaxis aceptada por el intrprete acompaada de un ejemplo: Bucle hasta: until [ expresin ]; do cdigo_a_iterar modificar_miembro_de_expresin done Ejemplo "sc_until.sh" sin parmetros: #! /bin/sh CONTADOR = 20 until [ $CONTADOR -lt 10 ]; do echo CONTADOR $CONTADOR let CONTADOR=$CONTADOR-1 #let es comando interno del intrprete done Bucle mientras: while [ expresin ]; do cdigo_a_iterar modificar_miembro_de_expresin done Ejemplo "sc_while.sh" sin parmetros: #! /bin/sh CONTADOR=0 while [ $CONTADOR -lt 10 ]; do echo el contador vale $CONTADOR let CONTADOR=CONTADOR+1

done Bucle para: for VARIABLE in [orden_shell lista de elementos]; do cdigo_a_iterar done Ejemplo 1 "sc_for1.sh" sin parmetros: #! /bin/sh for i in $( ls ) ; do echo item: $i done Ejemplo 2 "sc_for2.sh" sin parmetros: #! /bin/sh for i in 1 2 3 4 5; do echo $i done T A R E A S ----------1 Editar los scripts de ejemplo y ejecutarlos para ver el resultado por pantalla. 2 Crear un script que tomando 2 parmetros numricos determine el parmetro de mayor valor y lo presente por pantalla. 3 Mejorar el script de la actividad anterior para que calcule la media aritmtica del valor numrico de un nmero indeterminado de parmetros. (Ayuda: utiliza el comando 'shift') 4 Generar la tabla de multiplicar del 2, 3, 4 y 5 con un script. (Ayuda: utiliza un for dentro de otro -for anidado-). <->

You might also like