prac_os_10(programacion shell 2).pdf

10
  Programación Shell 2/3 SISTEMAS OPERATIVOS Nom br e Tut or : .............................................................. Nivel : ................. Paralelo: ........... Secci ón: .................. Fecha: ............... Unidad : ................................................................................................................ Tema : ................................................................................................................ Int egran tes : .............................................................. .............................................................. .............................................................. Práctica de laboratorio SHELL Estructuras de control Duración estimada: 90 min. Objetivos:  Aprender las estructuras de control para automatizar tareas utilizando los comandos básicos para la manipulación de ficheros y directorios dentro de un determinado Sistema Operativo, en este caso Linux.  Entrada de datos con read  Sentencia condicional 'if'  Sentencia condicional 'case'   Bucles 'while' y 'until'  Bucle 'for'  'break' y 'continue' Información básica: El lenguaje shell-script es muy versátil aunque hay que advertir que es bastante ineficiente. Son mucho más eficientes los programas escritos en lenguaje C. Este es el lenguaje en el que se escribió el kernel de Linux y otros muchos SO. El Bash no es tan eficiente como el C. El valor del lenguaje shell-script es que permite hacer cosas complicadas con muy poco esfuerzo en perfecta combinación con una serie de comandos también muy potentes disponibles en Linux Herramientas / Preparación: Podrá trabajar de forma individual, el instructor necesitará identificar la ubicación de los materiales de capacitación como hardware o PC para los estudiantes. Serán necesarios los siguientes recursos:  PC con monitor, teclado, ratón y ca bles de alimentación  Sistema o perativo L inux (Red Hat, SuSe, Mandrake, Caldera, etc) instalado en el PC Paso 1 – Entrada de datos con r ead La instrucción 'read' permite capturar datos desde la entrada estándar. Para ello queda a la espera de un fin de línea. Edite el fichero siguiente y llámelo 'pru_read'. Sistemas Operativos Msc. Washington Ramírez M. Pag. 1

Upload: sonyw200

Post on 05-Nov-2015

6 views

Category:

Documents


0 download

TRANSCRIPT

  • Programacin Shell 2/3

    SISTEMAS OPERATIVOS

    Nombre Tutor : .............................................................. Nivel : ................. Paralelo: ........... Seccin: .................. Fecha: ............... Unidad : ................................................................................................................ Tema : ................................................................................................................ Integrantes : .............................................................. .............................................................. ..............................................................

    Prctica de laboratorio SHELL Estructuras de control Duracin estimada: 90 min.

    Objetivos:

    Aprender las estructuras de control para automatizar tareas utilizando los comandos bsicos para la manipulacin de ficheros y directorios dentro de un determinado Sistema Operativo, en este caso Linux.

    Entrada de datos con read Sentencia condicional 'if' Sentencia condicional 'case' Bucles 'while' y 'until' Bucle 'for' 'break' y 'continue'

    Informacin bsica: El lenguaje shell-script es muy verstil aunque hay que advertir que es bastante ineficiente. Son mucho ms eficientes los programas escritos en lenguaje C. Este es el lenguaje en el que se escribi el kernel de Linux y otros muchos SO. El Bash no es tan eficiente como el C. El valor del lenguaje shell-script es que permite hacer cosas complicadas con muy poco esfuerzo en perfecta combinacin con una serie de comandos tambin muy potentes disponibles en Linux Herramientas / Preparacin:

    Podr trabajar de forma individual, el instructor necesitar identificar la ubicacin de los materiales de capacitacin como hardware o PC para los estudiantes. Sern necesarios los siguientes recursos:

    PC con monitor, teclado, ratn y cables de alimentacin Sistema operativo Linux (Red Hat, SuSe, Mandrake, Caldera, etc)

    instalado en el PC

    Paso 1 Entrada de datos con read

    La instruccin 'read' permite capturar datos desde la entrada estndar. Para ello queda a la espera de un fin de lnea. Edite el fichero siguiente y llmelo 'pru_read'.

    Sistemas Operativos Msc. Washington Ramrez M. Pag. 1

    SoludevtPrctica Linux

    Bsico - IntermedioPara mayor informacin, visitehttp://www.soludevt.com

    Copyright 2004 Soludevt.Reservados todos los derechos.

  • Programacin Shell 2/3

    echo -e "Introduzca su nombre : \c" read NOMBRE banner Hola $NOMBRE

    Ejecute './pru_read'. Observe que los datos introducidos son guardados en la variable NOMBRE. Si pulsa directamente la variable tomar valor "".

    Cuando se usa la instruccin 'read' sin una variable el contenido se guardar en la variable REPLY pero si lo que desea es guardar el contenido queda ms claro guardarlo en una variable concreta. Ms adelante veremos ejemplos que usan esta instruccin.

    Paso 2 Sentencia condicional 'if'

    Ya hemos visto una forma de hacerlo usando los operadores '||' o '&&' de la shell, pero existen formas que pueden resultar ms verstiles y ms legibles.

    if _condicin_ then _lista_de_ordenes_ [ elif _condicin_ then _lista_de_ordenes_ ] ... [ else _condicin_ ] fi

    En lugar de _condicin_ podramos haber puesto _lista_de_ordenes_ pero queremos resaltar que el cdigo de retorno va a ser evaluado.

    Las partes entre corchetes son opcionales y si van seguidas de tres puntos '...' indica que puede presentarse varias veces. Todas las sentencias condicionales 'if' empiezan con la palabra reservada 'if' y terminan con la palabra reservada 'fi'.

    Mejor vamos a ilustrar con algunos ejemplos. Deber editarlos y ejecutarlos.

    # Esto siempre mostrara '123' if true then echo '123' fi

    Acabamos de utilizar una condicin que siempre se cumplir. Vamos a ver algo un poco ms til.

    # Si la variable CMPRT01 est definida y contiene el nombre de un fichero # con permiso de lectura se mandar a la impresora con 'lp' if test -r $CMPRT01 then lp $CMPRT01 fi

    Tambin podemos programar una accin para cuando se cumpla una condicin y otra para cuando no se cumpla.

    Sistemas Operativos Msc. Washington Ramrez M. Pag. 2

  • Programacin Shell 2/3

    # Si La variable 'modo' contiene el valor 'lp' imprimir el fichero $FICH # en caso contrario sacarlo por pantalla. if [ "$modo" = "lp" ] then lp $FICH else cat $FICH fi

    El siguiente ejemplo edtelo con el nombre 'tipofichero'. Nos servir para ilustrar el uso de 'elif' y para repasar algunas de las opciones de 'test'.

    # tipofichero FILE=$1 if test -b $FILE then echo $FILE 'Es un dispositivo de bloques' elif test -c $FILE then echo $FILE 'Es un dispositivo especial de caracteres' elif test -d $FILE then echo $FILE 'Es un directorio' elif test -f $FILE then echo $FILE 'Es un fichero regular (ordinario)' elif test -L $FILE then echo $FILE 'Es un Link simblico' elif test -p $FILE then echo $FILE 'Es un pipe con nombre' elif test -S $FILE then echo $FILE 'Es un Socket (dispositivo de comunicaciones)' elif test -e $FILE then echo $FILE 'Existe pero no sabemos que tipo de fichero es' else echo $FILE 'No existe o no es accesible' fi

    Para usar este ltimo ejemplo ejecute './tipofichero ..' o './tipofichero tipofichero' Tenga en cuenta que si bien la 'bash' admite el uso de 'elif' quizs otras shell no lo admitan. Paso 3 Sentencia condicional 'case'

    Ya hemos visto que con 'elif' podemos evaluar distintas condiciones programando una accin para cada caso.

    Existe un caso especial. Imaginemos que deseamos evaluar una variable y en funcin de lo que contenga hacer una cosa u otra. Podramos usar una sentencia condicional con abundantes 'elif' pero hay que tener en cuenta una cosa. Con 'elif' tenemos que ir evaluando a cada paso hasta que se cumpla una vez y entonces se ejecuta la accin y ya no se ejecuta ninguna otra porque habremos finalizado. En el caso anterior si hubiramos introducido el nombre de un pipe con nombre se habran ejecutado varios test antes de determinar que era un pipe con nombre, y eso resulta lento.

    Si lo que deseamos hacer est en funcin de un valor utilizaremos la sentencia condicional 'case' que es mucho ms eficiente porque no requiere ejecutar varias ordenes o una orden varias veces como en el caso anterior.

    La sintaxis para la sentencia condicional 'case' sera de la siguiente forma:

    case valor in [ _lista_de_patrones_ ) _lista_de_ordenes_ ;; ] ... esac

    Sistemas Operativos Msc. Washington Ramrez M. Pag. 3

  • Programacin Shell 2/3

    Por valor queremos indicar el resultado de cualquier expansin producida por la shell. La _lista_de_patrones_ son uno o ms patrones separados por el carcter '|' y cada patrn es del mismo tipo que los patrones utilizados para la expansin de nombres de ficheros. El orden es importante porque se van comprobando por orden y en el momento que uno de los patrones corresponda con el valor se ejecutar la _lista_de_ordenes_ que le corresponda y ya no se ejecutar nada ms. Es frecuente utilizar en ltimo lugar un patrn '*)' para que en caso de no encontrar ninguna correspondencia con los patrones anteriores se ejecute siempre una accin por defecto. Edite el siguiente ejemplo y slvelo con nombre 'prueba_case'.

    # prueba_case case $1 in 1) echo Uno ;; 2) echo Dos ;; [3-7]) echo "Entre tres y siete ambos incluidos" ;; 8|9|0) echo Ocho; echo Nueve; echo Cero ;; [a-zA-Z]) echo Una Letra ;; start|begin) echo Comienzo ;; stop|end) echo Fin ;; *) echo 'Fallo' esac

    Ahora le damos permiso de ejecucin y probamos como funciona.

    $ ./prueba_case 1 Uno $ ./prueba_case 2 Dos $ ./prueba_case 7 Entre tres y siete ambos incluidos $ ./prueba_case h Una Letra $ ./prueba_case start Comienzo $ ./prueba_case begin Comienzo $ ./prueba_case aa Fallo $ ./prueba_case 12 Fallo $ ./prueba_case 9 Ocho Nueve Cero $ ./prueba_case stop Fin

    Recuerde que la ejecucin de una orden externa en un shell-srcipt es una operacin costosa. Hacer un script ineficiente puede no tener ninguna importancia dependiendo del uso que le demos y de lo sobrada de recursos que est la mquina, pero en otros caso si ser ms

    Sistemas Operativos Msc. Washington Ramrez M. Pag. 4

  • Programacin Shell 2/3

    importante as que haciendo las cosas lo mejor posible estaremos preparados en un futuro para trabajos ms exigentes.

    Paso 4 Bucles 'while' y 'until' while _condicin_ do _lista_de_ordenes_ done

    En lugar de _condicin_ podramos haber puesto _lista_de_ordenes_ pero queremos resaltar que el cdigo de retorno va a ser evaluado.

    Mientras se cumpla la condicin se ejecutar _lista_de_ordenes_. Resulta evidente que si dentro de la _lista_de_ordenes_ no hay nada capaz de alterar la condicin, resultar un bucle que se ejecutar de forma ininterrumpida. (Bucle infinito). Si esto ocurre habr que matar el proceso enviando alguna seal.

    Existe un bucle muy similar y que solo se diferencia en que no para nunca hasta que se cumpla la condicin. Es decir justo al revs que antes.

    until _condicin_ do _lista_de_ordenes_ done Edite como 'pru_while1' el siguiente ejemplo.

    # pru_while1 # Hacer un bucle de captura por consola (terminara cuando se pulse # solo ) y mostrar el resultado de cada captura entre parntesis. # Inicializamos primero la variable LINEA con un valor cualquiera # pero distinto de "" LINEA="x" while test $LINEA do read LINEA echo '('$LINEA')' done

    Cuando pulsemos directamente sin nada ms LINEA valdr "" y 'test $LINEA' devolver FALSE y el bucle finalizar. Vamos a ejecutar el ejemplo para comprobar su funcionamiento.

    $ ./pru_while1 aaaaa (aaaaa) bbbbb (bbbbb) ()

    Sistemas Operativos Msc. Washington Ramrez M. Pag. 5

  • Programacin Shell 2/3

    Vemos que en la ltima ejecucin LINEA vala "".

    Paso 5 Bucle 'for'

    Se proporciona una lista de elementos y se ejecuta una lista de rdenes haciendo que una variable vaya tomando el valor de cada uno de estos elementos. Entre estas rdenes se puede utilizar un nuevo bucle 'for'.

    El siguiente ejemplo funciona pero es una mala idea ya que supone Varias ejecuciones de un comando cuando se poda haber hecho con uno solo. Habra sido mejor hacer 'chmod +x *'.

    for i in $* do chmod +x $i done

    El siguiente ejemplo no funcionar si no prepara un poco una serie de cosas que se necesitan. Concretamente deber de existir un fichero 'lista' con varios elementos. Varios ficheros con nombre que empiecen por SCAN. Varios ficheros '*.doc' de los cuales algunos debern contener la palabra 'CODIGO'. Estudie el contenido del ejemplo que sigue.

    Edtelo y ejectelo pasando varios argumentos. Su objetivo es hacerlo funcionar y entender como funciona.

    # Para ver distintos modos de manejar listas vamos a generar todos los # nombres posibles formados por combinacin de las partes siguientes: # Como parte 1 los nombres de ficheros de directorio actual que # empiezan por 'SCAN'. # Como parte 2 los nombres contenidos en el fichero 'lista'. # Como parte 3 los identificadores 'cxx0 cxx2 bxx5' # Como parte 4 la lista de parmetros $1 $2 $3 .. etc, # Como parte 5 los ficheros '*.doc' que contienen la palabra 'CODIGO'. ### for i in `ls SCAN*` do for j in `cat lista` do for k in cxx0 cxx2 bxx5 do for l in $* do for m in `grep -l "CODIGO" *.doc` do echo $i.$j.$k.$l.$m done done done done done

    Cuando tengamos bucles unos dentro de otros decimos que son bucles anidados. El nivel de anidamiento de un bucle es el nmero de bucles que hay unos dentro de otros.

    Sistemas Operativos Msc. Washington Ramrez M. Pag. 6

  • Programacin Shell 2/3

    Paso 6 'break' y 'continue'

    Existe una forma de controlar un blucle desde el interior del mismo. Para eso podemos usar 'break', o 'continue'. Se pueden usar en cualquiera de los bucles que acabamos de ver (while, until, y for).

    La palabra reservada 'break' provoca la salida de un bucle por el final. Si viene seguido de un numero 'n' saldr de 'n' niveles. No poner nmero equivale a poner el nmero 1.

    La palabra reservada 'continue' provoca un salto al comienzo del bucle para continuar con la siguiente iteracin. Si viene seguida de un numero 'n' saldr de 'n' niveles.

    # pru_break_continue # Definir la variable j como una variable de tipo entero e inicializarla a # cero. Luego la incrementamos a cada iteracin # del bucle y si j es # menor que diez mostramos el doble de su valor y en caso contrario # salimos del bucle typeset -i j=0 while true do let j=j+1 if [ $j -et 3 ] then continue fi if [ $j -et 4 ] then continue fi if [ $j -lt 10 ] then expr $j \* 2 else break fi done

    Probamos ahora a ejecutarlo y obtendremos

    $ ./pru_break_continue 2 4 10 12 14 16 18

    Ahora edite y pruebe el siguiente ejemplo que llamaremos 'pru_break_continue2'

    Sistemas Operativos Msc. Washington Ramrez M. Pag. 7

  • Programacin Shell 2/3

    # ./pru_break_continue2 for i in uno dos tres do for j in a b c do for k in 1 2 3 4 5 do echo $i $j $k if [ "$j" = "b" ] then break fi if [ "$k" = "2" ] then continue 2 fi done done done

    El resultado de la ejecucin sera como sigue.

    $ ./pru_break_continue2 uno a 1 uno a 2 uno b 1 uno c 1 uno c 2 dos a 1 dos a 2 dos b 1 dos c 1 dos c 2 tres a 1 tres a 2 tres b 1 tres c 1 tres c 2

    Paso 7 Resolver los siguientes tems Ejercicio mi_banner.txt Localice en su sistema la utilidad 'banner' para consola. Puede haber ms de una utilidad para esto y algunas estn pensadas para su uso con impresora. Nos interesa la utilidad 'banner' para terminal de forma que el comando 'banner hola' genere la siguiente salida: # # #### # ## # # # # # # # ###### # # # # # # # # # # ##### # # # # # # # # # #### ##### # # Partiendo de esta utilidad realice un shell-script 'mi_banner.sh' que admita hasta tres argumentos de tamao mximo de cuatro caracteres tal que el comando './mi_banner.sh hola jose luis' obtenga:

    Sistemas Operativos Msc. Washington Ramrez M. Pag. 8

  • Programacin Shell 2/3

    ooooooooo oooooooo _/ _/ _/_/_/_/ _/ _/_/ ooooooo _/ _/ _/ _/ _/ _/ _/ oooooo _/_/_/_/_/ _/ _/ _/ _/ _/ ooooo _/ _/ _/ _/ _/ _/_/_/_/_/ oooo _/ _/ _/ _/ _/ _/ _/ ooo _/ _/ _/_/_/_/ _/_/_/_/_/ _/ _/ oo ooooooooo oooooooo _/ _/_/_/_/ _/_/_/_/ _/_/_/_/_/_/ ooooooo _/ _/ _/ _/ _/ oooooo _/ _/ _/ _/_/_/_/ _/_/_/_/_/ ooooo _/ _/ _/ _/ _/ oooo _/ _/ _/ _/ _/ _/ _/ ooo _/_/_/_/ _/_/_/_/ _/_/_/_/ _/_/_/_/_/_/ oo ooooooooo oooooooo _/ _/ _/ _/ _/_/_/_/ ooooooo _/ _/ _/ _/ _/ oooooo _/ _/ _/ _/ _/_/_/_/ ooooo _/ _/ _/ _/ _/ oooo _/ _/ _/ _/ _/ _/ ooo _/_/_/_/_/ _/_/ _/ _/ _/_/_/_/ oo Ejercicio backup.sh Un sencillo ejemplo es realizar un backup de solo ciertos directorios (prog_dir1 y prog_dir2), luego comprimirlos usando bzip2 y enviarlos a un rea de almacenamiento (digamos una unidad ZIP previamente montada en /mnt/zipdrive), y adems con que el nombre del archivo contenga la fecha del da. Suena difcil? Realmente no lo es. Se crea un archivo texto con cualquier nombre, por ejemplo mibackup que contenga las instrucciones que se desea ejecutar. #!/bin/sh # echo "---------- Captura fecha -----------" fecha=`date +%Y%m%d` # echo "---------- Haciendo Tar -----------" tar cvf backup$fecha.tar prog_dir1 prog_dir2 # echo "----------- Comprimiendo -----------" bzip2 backup$fecha.tar # echo "---------- Envindolos a zip -------" cp ./backup$fecha.tar /mnt/zipdrive # echo "----------- Limpiando --------------" rm -f ./backup$fecha.tar # echo "----------- Final -------------"

    Luego, se le asigna permisos de ejecucin con el comando chmod +x mibackup y esta listo para ser ejecutado.

    Sistemas Operativos Msc. Washington Ramrez M. Pag. 9

  • Programacin Shell 2/3

    Ejercicio piramide.txt Realice un shell-scrip 'piramide.sh' que admita como argumento un nmero 'N' y que obtenga la salida una serie de 'N' filas de forma triangular. Para ./piramide.sh 12 la salida sera. 01 02 02 03 03 03 04 04 04 04 05 05 05 05 05 06 06 06 06 06 06 07 07 07 07 07 07 07 08 08 08 08 08 08 08 08 09 09 09 09 09 09 09 09 09 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 12 12 12 12 12 12 12 12 12 12 12 12

    Ejercicio vigila.txt Realizar un shell-script que escriba en el fichero '/tmp/usuarios' una lnea con la fecha y otra con el nmero de usuarios distintos que estn conectados en ese momento cada dos minutos.

    CONCLUSIONES ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ BIBLIOGRAFA. 1. STEVE Shah, Manual de administracin de Linux, Osborne McGraw-Hill. Espaa, 2001.

    2. SCO UNIX System V/386 Operating System, System Administrators Guide.

    Sistemas Operativos Msc. Washington Ramrez M. Pag. 10