La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

2008 Escuela de Informática y Telecomunicaciones, DuocUC Escuela de Informática y Telecomunicaciones Clase 8: Control del flujo en BASH Nombre unidad de.

Presentaciones similares


Presentación del tema: "2008 Escuela de Informática y Telecomunicaciones, DuocUC Escuela de Informática y Telecomunicaciones Clase 8: Control del flujo en BASH Nombre unidad de."— Transcripción de la presentación:

1 2008 Escuela de Informática y Telecomunicaciones, DuocUC Escuela de Informática y Telecomunicaciones Clase 8: Control del flujo en BASH Nombre unidad de aprendizaje: Introducción a los SCRIPTS. Programación Aplicada PAD3501

2 2© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Objetivos  Objetivos de la clase  Programa rutinas utilizando los diferentes tipos de variables, constantes, operadores y sentencias de control en lenguaje Bash.

3 3© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa WHILE  La sintaxis de la SENTENCIA ITERATIVA WHILE es la siguiente: while test condición do sentencias done

4 4© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa WHILE  Las sentencias del WHILE se ejecutarán mientras la condición evaluada con test se mantenga en “verdadero”; cuando la condición alcance el valor de verdad “falso” el ciclo WHILE dejará de ejecutarse.  Una vez finalizado el ciclo WHILE, el control de la ejecución del SCRIPT es pasado a la siguiente instrucción después del bloque del WHILE.

5 5© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa WHILE

6 6© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa WHILE  Veamos un ejemplo de uso de WHILE: #!/bin/bash echo –e “Ingrese un número: \c” read num i=1 sum=0 while test $i –le $num do sum=$(expr $sum + $i) i=$(expr $i + 1) done echo –e “La suma de 1 a $num es: $sum\n”

7 7© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa WHILE  En el ejemplo anterior se obtiene la suma de los números entre 1 y un número (positivo) leído desde el teclado.  En el siguiente ejemplo, se imprimen en pantalla todos los divisores de un número (positivo) leído desde teclado:

8 8© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa WHILE #!/bin/bash echo –e “Ingrese un número: \c” read num i=1 while test $i –le $num do resto=$(expr $num % $i) if test $resto –eq 0 then echo –e “$i” fi i=$(expr $i + 1) done

9 9© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa WHILE  En el siguiente SCRIPT de ejemplo utilizaremos la sentencia WHILE para examinar la variable de ambiente PATH y mostrar los directorios que componen dicha variable.  Aprovecharemos el hecho de que una cadena en un test de condición evalúa como “verdadero” cuando NO está vacía y evalúa como “falso” cuando está vacía.

10 10© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa WHILE #!/bin/bash path=$PATH while [ $path ] do echo ${path%:*} if [ ${path#*:} = $path ] then path= else path=${path#*:} fi done

11 11© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa WHILE  En la solución propuesta al ejercicio planteado, la comprobación [ ${path#*:} = $path ] se hace para que cuando quede un solo directorio sin dos puntos pongamos la variable path a vacía, ya que el patrón del operador de búsqueda de patrones no se cumple si la cadena no tiene el símbolo de dos puntos (:).  Podemos usar el ciclo WHILE para leer todas las líneas de un archivo, tal como se muestra en el siguiente ejemplo:

12 12© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa WHILE  Este método de lectura del archivo tiene el inconveniente de eliminar el formateado de las líneas y especialmente los espacios y tabulaciones. #!/bin/bash while read línea do echo –e "$línea\n" done < file.txt

13 13© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencias true y false  Dos órdenes sencillas que pueden ser utilizadas, por ejemplo dentro de los ciclos, son true y false.  Como sus nombres lo indican, true siempre devuelve un valor cierto (cero), y false siempre devuelve un valor falso (distinto de cero).  La sentencia true usualmente se utiliza junto con WHILE para construir ciclos infinitos, por ejemplo, en la implementación de un menú:

14 14© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencias true y false while true do clear echo “\t\tMENU PRINCIPAL” echo “\t\t**********************\n\n” echo “\t\t1) Ver un archivo” echo “\t\t2) Listar un directorio” echo “\t\t5) Listar usuarios activos” echo “\t\t6) Salir\n\n\n” echo ““\t\tIngresar Opción: \c” read opc … done

15 15© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencias break y continue  Las sentencias break y continue tiene el mismo comportamiento que sus respectivas contrapartes en los lenguajes como C y PERL.  La ejecución de un break dentro de un ciclo WHILE o FOR hace que la ejecución de dicho ciclo finalice.  Por otro lado, la ejecución de un continue dentro de un ciclo hace que se descarte la iteración en curso y el flujo de programa “salte” a la siguiente iteración.

16 16© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencias break y continue #!/bin/bash while true do clear echo –e “Número: \c” read num if test $num –eq 0 then break fi done

17 17© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencias break y continue  En el ejemplo anterior, se ingresan números (TODOS los que uno quiera, pero no nulos) hasta cuando se ingresa cero, en ese instante el ciclo infinito termina de ejecutarse, pues se ejecuta la sentencia break.  Si existen varios ciclos anidados, break terminará la ejecución del último que se ha abierto.

18 18© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencias break y continue  Es posible salir de n niveles de ciclo mediante la instrucción break n.  La instrucción continue reinicia el bucle con la próxima iteración dejando de ejecutar cualquier orden posterior en la iteración en curso.

19 19© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa FOR  La sintaxis de la SENTENCIA ITERATIVA FOR es la siguiente: for variable [ in lista_de_valores ] do sentencias done

20 20© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa FOR  En el ciclo FOR, variable va tomando de uno en uno los valores de la lista_de_valores, el primer valor de la lista será tomado en la primera iteración, el segundo valor de la lista será tomando en la segunda iteración,…, así sucesivamente hasta tomar TODOS los valores de la lista.  Notar que en cada iteración se ejecutarán las sentencias que componen el cuerpo del FOR.

21 21© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa FOR

22 22© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa FOR  En resumen, el ciclo FOR no se repite un número fijo de veces (comportamiento por defecto), sino que se repite de acuerdo con la cantidad de palabras o argumentos que compongan la lista_de_valores especificada en la sentencia.  En el formato anterior, in lista_de_valores es opcional, si se omite, el FOR recorrerá el contenido de $@.

23 23© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa FOR  Veamos un ejemplo sencillo de uso de FOR:  Aquí, claramente el FOR se ejecutará 3 veces, pues en la lista_de_valores aparecen 3 nombres. #!/bin/bash for nombre in María Juan Luis do echo –e “Hola $nombre” done

24 24© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa FOR  El delimitador que usa el ciclo FOR para lista_de_valores es el que se especifique en la variable de ambiente IFS, y por defecto es el “espacio”.  La lista_de_valores del ciclo FOR también puede contener comodines (como por ejemplo, el “*”). A modo de ejemplo, el siguiente SCRIPT muestra en pantalla la lista de los archivos del directorio actual:

25 25© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa FOR  Notar que para recorrer los argumentos recibidos por el SCRIPT, lo adecuado es utilizar $@ entre comillas, es decir, usar “$@”. #!/bin/bash for archivo in * do echo –e $archivo done

26 26© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa FOR  En el siguiente ejemplo de uso del ciclo FOR, se imprimirá en pantalla la lista de todos los archivos ejecutables que fueron pasados como parámetros al SCRIPT: #!/bin/bash for archivo in “$@” do if [ -x $archivo]; then echo –e $archivo fi done

27 27© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa FOR  Mediante el uso de la sentencia seq, podemos hacer que el comportamiento del ciclo FOR sea más parecido al FOR de C y PERL: #!/bin/bash for i in $(seq 1 10) do echo –e $i done

28 28© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa FOR  Por último, podemos usar el ciclo FOR para leer todas las líneas de un archivo, tal como se muestra en el siguiente ejemplo: #!/bin/bash oldIFS=$IFS IFS=$'\n' for línea in $(cat archivo) do echo –e "$línea\n" done IFS=$old_IFS

29 29© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa FOR  El ciclo FOR asociado a un cambio de IFS, a diferencia del WHILE, permite conservar la estructura del documento en la salida.

30 30© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa UNTIL  La sintaxis de la SENTENCIA ITERATIVA UNTIL es la siguiente:  El ciclo UNTIL se ejecuta hasta que la evaluación de la condición con test alcance “verdadero”. until test condición do sentencias done

31 31© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa UNTIL  Según esto último, UNTIL se puede interpretar como ejecutar varias veces un comando hasta que tenga éxito.  Veamos un ejemplo sencillo de uso de UNTIL: #!/bin/bash num=0 until test $num –gt 0 do echo –e “Ingresar un número positivo: \n” read num done

32 32© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia iterativa UNTIL  En este ejemplo, el UNTIL se repetirá hasta que el usuario ingrese un número positivo.  Veamos otro ejemplo de uso de UNTIL: #!/bin/bash cont=10 until test $cont -lt 0 do cont=$(expr $cont - 1) echo –e $cont done echo –e “Valor final del contador: $cont\n”

33 33© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia SELECT  Otra sentencia bastante útil al momento de definir SCRIPTS de menú y sus opciones es la sentencia SELECT.  La sintaxis de la sentencia SELECT es la siguiente: select variable in lista do sentencias done

34 34© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia SELECT  Mediante SELECT podemos crea menús de selección de manera muy cómoda; podemos definir un arreglo con todas las opciones y SELECT las mostrará en pantalla por nosotros.  Veamos un ejemplo de implementación de un SCRIPT de menú y sus opciones con la sentencia SELECT:

35 35© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia SELECT #!/bin/bash PS3="Ingresar Opción: " opciones="opción1 opción2 salir" echo opciones $opciones select opt in $opciones do echo $opt if [ "$opt" = "salir" ] then exit fi done

36 36© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia SELECT  Notar que en el ejemplo anterior se ha utilizado la sentencia PS3=“Ingresar Opción: “ para que este “prompt” aparezca una vez se ejecute el SCRIPT.  La línea leída se almacena en la variable REPLY, y obviamente puede ser desplegada usando echo $REPLY.  Veamos un ejemplo de SCRIPT con SELECT usando estas características:

37 37© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Desarrollo Sentencia SELECT #!/bin/bash PS3="Elegir el archivo a proteger: " Salir="Salir de este programa" touch "$Salir" select archivo in *; do case $archivo in "$Salir") exit;; *) echo "$archivo ($REPLY)" chmod go-rwx "$archivo";; esac done rm –f "$Salir"

38 38© 2007 Cisco Systems, Inc. Todos los derechos reservados.Cisco Public Escuela de Informática y Telecomunicaciones Resumen  Resumen de la clase  while – Permite ejecutar una serie de comandos mientras que una determinada condición se cumpla.  for – Permite ejecutar una serie de comandos un número determinado de veces.  until – Permite ejecutar una serie de comandos hasta que una determinada condición se cumpla.  select – Permite crear menús de selección de manera muy rápida y cómoda.


Descargar ppt "2008 Escuela de Informática y Telecomunicaciones, DuocUC Escuela de Informática y Telecomunicaciones Clase 8: Control del flujo en BASH Nombre unidad de."

Presentaciones similares


Anuncios Google