arqcomp p4

13
ARQUITECTURA DE COMPUTADORES PRÁCTICA 4 El Shell de UNIX como lenguaje de programación (I)

Upload: carlos7624

Post on 08-Nov-2015

218 views

Category:

Documents


0 download

DESCRIPTION

fdsfsdfsdfsdfsdfsdfsdfsdfsdf

TRANSCRIPT

  • ARQUITECTURA DE COMPUTADORES

    PRCTICA 4

    El Shell de UNIX como lenguaje de

    programacin (I)

  • Contenido

    1.1 INTRODUCCION

    1. 2. SHELL SCRIPTS 1.2.1 Argumentos en shell scripts

    1.3 LAS COMILLAS

    1.4 VARIABLES 1.4.1 Variables y comillas 1.4.2 Ambito de las variables 1.4.3 El entorno del shell

    1.5 CONTROL DEL FLUJO (I) 1.5.1 Bucles con la sentencia for 1.5.2 Ejecucin condicional con la sentencia if 1.5.3 Las rdenes test y expr

    1.6 EL FICHERO PROFILE

  • Introduccion 1.1 INTRODUCCION

    El shell o intrprete de rdenes de UNIX es un programa ejecutable (como cualquier otro programa de usuario) que se encuentra disponible en cualquier entorno UNIX y cuyo cometido es leer rdenes para el sistema operativo, analizarlas y realizar las llamadas al sistema que sean necesarias para ejecutarlas.

    Este intrprete define, al igual que ocurre con cualquier otro intrprete o traductor,

    un lenguaje de programacin que posee caractersticas como:

    Variables. Palabras y caracteres reservados (tambin conocidos como metacarateres). Procedimientos, ms conocidos como shell scripts. Estructuras para el control del flujo tipo if, while, etc. Manejo de seales.

    Realmente en un sistema UNIX existen varios intrpretes de rdenes, pudiendo

    elegir cada usuario el que prefiera. El intrprete de rdenes ms bsico es el Bourne shell, o sh, que est disponible en cualquier sistema. Otros intrpretes de rdenes usuales son el Korn shell, o ksh, el shell con sintaxis del tipo de lenguaje C o csh y el Bourne-Again Shell o bash que es totalmente compatible con el sh al tiempo que incorpora caractersticas del ksh y csh.

    Esta prctica introducir las caractersticas y la sintaxis del sh, las cuales resultan

    tambin aplicables al ksh y al bash.

    1.2 SHELL SCRIPTS

    Las rdenes que el shell debe ejecutar pueden ser proporcionadas a travs del teclado o como un programa contenido en un fichero. Se denomina shell script a todo fichero que contenga rdenes para ser ejecutadas por el shell. Por ejemplo, se puede crear un fichero denominado usuarios con el siguiente contenido:

    # Programa usuarios echo El nmero de usuarios es: who | wc -l

    Las lineas que comienzan por el carcter # son comentarios. La ejecucin de dicho fichero puede realizarse de tres formas distintas:

  • 1. Creando un shell no interactivo (no espera rdenes de teclado) y redirigiendo su entrada al fichero usuarios:

    $ sh < usuarios

    2. Creando un shell no interactivo y pasndole el fichero usuarios como argumento:

    $ sh usuarios 1 3. Dando permiso de ejecucin al fichero usuarios y ejecutndolo como si fuese otra orden:

    $ chmod +x usuarios $ usuarios Probablemente el directorio desde el que tratas de ejecutar el shell script no est includo en el path por lo que, si obtienes un mensaje de error, prueba indicndole el directorio desde el que lo quieres ejecutar con: $ ./usuarios En este ltimo caso, el shell detecta que se trata de un shell script y, al igual que en los casos anteriores crea otro shell para que lo ejecute.

    1.2.1 Argumentos en shell scripts Un shell script puede invocarse con argumentos, los cuales pueden ser referenciados como $0, $1, $2, $3, etc. El argumento $0 referencia el propio nombre del programa, en tanto que $* referencia todos los argumentos y $# indica el nmero de argumentos. Esto se ilustra con el programa argumentos: $ vi argumentos # Programa argumentos. echo Orden tecleada: $* echo Nmero de argumentos: $# echo Nombre de la orden: $0 echo Argumento 1: $1 echo Argumento 2: $2 echo Argumento 3: $3

    que, despus de ponerle permisos de ejecucin, puede invocarse como: $ argumentos pera uva limon

  • 1.3 LAS COMILLAS Dentro del conjunto de metacaracteres del shell existen tres tipos de comillas que tienen distintos significados. Las comillas simples evitan que el shell interprete las cadenas que delimitan, es

    decir, consiguen que el shell trate el texto contenido entre las comillas como si fuera un literal:

    $ echo /bin/c* $ echo /bin/c*

    Para evitar la interpretacin de un carcter tambin puede utilizarse la barra invertida \:

    $ echo * $ echo * $ echo \*

    Las comillas dobles son muy semejantes a las comillas simples y tambin evitan la

    interpretacin excepto s se da el caso del metacarcter $, que sirve para referenciar variables. Su uso se ilustrar cuando se introduzcan las variables.

    Las comillas inversas ` ` son muy diferentes a las comillas simples y dobles y permiten

    que la salida de la orden que delimitan pueda utilizarse como argumento de otra orden:

    $ echo date $ echo date $ echo date $ argumentos date $ argumentos date

    1.4 VARIABLES El shell, como cualquier otro intrprete, permite la utilizacin de variables que en este caso son siempre alfanumricas. Creacin y modificacin de variables: Una variable se crea asignndole una cadena

    de caracteres mediante el operador =. Este operador tambin permite modificar su valor:

    $ RUTA1=/bin $ RUTA2=/usr/bin $ yo=pepe

    Referencias a variables: Las variables se pueden referenciar utilizando el operador $:

    $ echo $RUTA1 $ echo $RUTA1 $yo $ RUTAS=$RUTA1:$RUTA2/$yo $ echo $RUTAS

  • 1.4.1 Variables y comillas Las comillas simples se utilizan para que los blancos y otros metacaracteres puedan formar parte de una cadena: $ saludo=Hola; que tal $ echo $saludo

    $ echo echo $RUTAS > rutas $ cat rutas

    Las comillas dobles permiten que el operador $ sea interpretado al asignar una variable: $ echo rutas: - $RUTAS $ echo rutas: - $RUTAS $ echo "echo $RUTAS" > rutas2 $ diff rutas rutas2

    Las comillas inversas permiten asignar una variable con la salida de una orden: $ hoy=date $ echo $hoy

    1.4.2 mbito de las variables Las variables del shell son accesibles, en principio, en el shell en que han sido creadas, permaneciendo inaccesibles a cualquier otro proceso. Para ilustrar este aspecto, se considerar la variable $RUTAS, creada anteriormente, y se comprobar su inaccesibilidad desde un shell hijo: $ echo $RUTAS $ sh $ ps $ echo $RUTAS $ exit $ ps $ echo $RUTAS

    Para ejecutar un shell script debe crearse un shell hijo desde el que tampoco son accesibles estas variables. Para comprobar este detalle ejecute el fichero rutas creado anteriormente: $ chmod +x rutas $ rutas No obstante, existe una forma de hacer accesible una variable a los procesos hijos de un proceso shell consistente en la utilizacin de la orden interna (palabra reservada) export: $ echo $RUTAS $ export RUTAS $ sh $ ps $ echo $RUTAS $ exit

  • $ ps $ rutas 1.4.3 El entorno del shell El conjunto de variables que forman el entorno del shell puede visualizarse utilizando la orden interna set. Por otro lado, la orden interna env visualiza nicamente aquellas exportables: $ set $ env El shell tiene algunas variables que son de particular inters para el usuario. Cabe destacar, entre otras, las siguientes: # El directorio de arranque de un usuario echo "HOME: $HOME # La ruta por defecto. El carcter : se usa como separador echo "PATH: $PATH # El tipo de terminal echo "TERM: $TERM # El primer prompt echo PROMPT: $PS1 Esto permite, por ejemplo, que el usuario pueda cambiar el prompt o modificar la ruta por defecto: $ PS1="[hostname] " $ PATH=$PATH:$HOME/bin 1.5 CONTROL DEL FLUJO (I) El shell posee sentencias para el control del flujo similares a las existentes en otros lenguajes de programacin, tales como for, if...else, case, while. Los siguientes subapartados describen su sintaxis e ilustran su utilizacin con diversos ejemplos. 1.5.1 Bucles con la sentencia for La sentencia for itera sobre una lista de valores y asigna en cada iteracin un valor a la variable asociada. Su sintaxis:

    for variable in lista de valores do sentencias done

    Por ejemplo, se puede utilizar un bucle for para visualizar los ficheros de /usr/bin que empiezan por a, b y c:

  • $ for i in a b c > do > echo PROGRAMAS QUE EMPIEZAN POR /usr/bin/$i > echo --------------------------------------- > ls /usr/bin/$i* > done Observe la aparicin del segundo prompt al utilizar una sentencia de control que abarca varias lneas. Los bucles for pueden anidarse. Por ejemplo, tal caracterstica puede ser til para escribir un programa que cree un fichero, cuyo nombre sea numerado, que contenga 30 lneas numeradas: 00: 01: ... 10: 11: 12: ... 28: 29: Realice este programa en un shell script cuyo nombre sea for2. $ vi for2 ... (Aqu tenis que escribir el programa) $ chmod +x for2 $ for2 ... $ cat numerado Los bucles for difieren, fundamentalmente, en la forma en que se proporciona la lista de valores. A continuacin se describen diversas formas de proporcionar esta lista. La lista de valores de un bucle for puede ser la lista de argumentos de un shell script. Por ejemplo, podra realizarse un fichero lsbin que visualice los ficheros de /usr/bin que empiecen por cada una de las cadenas alfanumricas que se proporcionan como argumento a lsbin. $ vi 1sbin for i in $* do echo PROGRAMAS QUE EMPIEZAN POR /usr/bin/$i echo --------------------------------------- ls /usr/bin/$i* done ... $ chmod +x lsbin $ lsbin a b ca cu La lista de valores de un bucle for tambin puede ser los ficheros del directorio actual. Por ejemplo, el siguiente programa crea una copia de seguridad de cada uno de los ficheros del directorio actual: $ for k in *

  • > do > cp $k $k.bak > echo Creada copia de $k > done y el siguiente programa mueve estas copias de seguridad a un subdirectorio denominado bak: $ mkdir bak $ for i in *.bak > do > mv $j bak/$j > echo Movido $i a bak/$j > done Finalmente la lista de valores de un bucle for tambin puede provenir de la ejecucin de una orden mediante comillas inversas. Por ejemplo, se puede registrar en un fichero amigos los nombres de login de sus dos vecinos inmediatos y el suyo propio. Para enviar su versin del programa for2 a sus "amigos" debera realizar: $ for i in cat amigos > do > mail $i < for2 > echo Enviando for2 a $i > done 1.5.2. Ejecucin condicional con la sentencia if La sentencia if permite la ejecucin condicional de rdenes. Su sintaxis es:

    if orden se ejecuta con xito then sentencias else sentencias alternativas fi

    Observe que la condicin de la sentencia if no es una expresin, sino una orden de Unix. La condicin es cierta si la orden "termina correctamente" (en cuyo caso se ejecutan las sentencias que siguen al then), y falsa en caso contrario (en cuyo caso se ejecutan las sentencias que siguen al else). La clusula else es opcional. Estado de terminacin de una orden Una orden se dice que "termina correctamente" (o con xito) cuando la orden termina su ejecucin sin dar ningn mensaje de error. En dicho caso, se dice que su estado de termnacin vale 0. El estado de terminacin de la ltima orden ejecutada por el shell se almacena en la variable de entorno $?. Observe su valor en la ejecucin de una orden que no termina correctamente y en una que termina correctamente: $ cp noexiste fich ... $ echo $?

  • $ cp for2 fich $ echo $? Realice un programa copia que ejecute la orden cp y compruebe su estado de terminacin: $ vi copia # Programa copia if cp $1 $2 2>/dev/null then echo "$1 ha sido copiado a $2 else echo "$1 no ha sido copiado a $2" fi

    La sentencia exit La sentencia exit fuerza la terminacin inmediata de un fichero de rdenes (no se ejecutan las sentencias que siguen a exit). El estado de terminacin del fichero de rdenes puede ser proporcionado como parmetro de exit. Utilizando exit, se puede completar el programa copia para que proporcione un estado de terminacin distinto de cero en el caso en que la orden no funcione correctamente: $ vi copia

    # Programa copia if cp $1 $2 2>/dev/null then echo "$1 ha sido copiado a $2" exit 0 else echo $1 no ha sido copiado a $2 exit 1 fi

    $ copia noexiste fich ... $ echo $? $ copia for2 fich $ echo $? 1.5.3 Las rdenes test y expr La orden test es un programa ejecutable (no una orden interna) que permite evaluar condiciones y, por lo tanto, resulta de gran utilidad para utilizarlo conjuntamente con la sentencia if. El siguiente ejemplo ilustra su uso: $ V1=cero $ test $V1 = cero (OJO con respetar los espacios del _=_ !!) $ echo $? No obstante, su utilizacin suele estar asociada a la sentencia if. Por ejemplo, se podra completar el programa copia para que compruebe el nmero de argumentos:

  • $ vi copia # Programa copia if test $# -ne 2 then echo Uso de copia: copia fl f2 echo Observe que copia necesita dos argumentos exit 1 fi

    ... $ copia f1 ... $ echo $? La notacin [ ] es una forma abreviada de ejecutar la orden test. De acuerdo con esto, la anterior condicin puede escribirse tambin como: $ vi copia # Programa copia if [$# -ne 2] then echo Uso de copia: copia fl f2 echo Observe que copia necesita dos argumentos exit 1 fi

    ... Los tipos de expresiones que puede evaluar la orden test son los siguientes: Expresiones numricas. La forma general de las expresiones es:

    N M donde N y M son interpretados como valores numricos. Los operadores que se pueden utilizar son:

    -eq N y M son iguales. -ne N y M son distintos. -gt N es mayor que M. -lt N es menor que M. -ge N es mayor o igual que M. -le N es menor o igual que M.

    Un ejemplo de utilizacin podra ser: $ users=`who | wc l` $ if test $users -gt 8 > then echo "Ms de ocho personas conectadas" >fi

  • Expresiones alfanumricas. La forma general de las expresiones es: S R donde S y R son cadenas alfanumricas. Los operadores que se pueden utilizar son:

    = las cadenas S y R son iguales. = las cadenas S y R son distintas.

    Note la diferencia entre la interpretacin de S y R como cadenas alfanumricas o como nmeros en el fichero de rdenes iguales: $ vi iguales

    if test $1 = $2 then echo Cadenas alfanumricamente iguales fi if test $1 = $2 then echo Cadenas alfanumricamente iguales (eliminando

    blancos) fi if test $1 -eq $2 then echo Cadenas numricamente iguales fi

    $ num1=0001 $ num2=1 $ num3= 1 $ iguales $num1 $num2 ... $ iguales $num2 $num3 Tipos de ficheros. La forma general de las expresiones es:

    fichero Las opciones que se pueden utilizar son:

    -s comprueba que el fichero existe y no est vaco. -f comprueba que el fichero existe y es regular (no directorio). -d comprueba si el fichero es un directorio. -r comprueba si el fichero tiene permiso de lectura. -w comprueba si el fichero tiene permiso de escritura. -x comprueba si el fichero tiene permiso de ejecucin.

    A continuacin se ofrece un ejemplo de utilizacin: $ vi ejec

    if [-x $1] then echo "$1 es ejecutable" else echo "$1 no es ejecutable o no existe" fi

    ... $ ejec noexiste ... $ ejec for2

  • Operadores 'and' y 'or'. Se pueden combinar varios operadores en una sola orden test mediante los operadores -o y -a que representan el "o lgico" e "y lgico" respectivamente. A continuacin se ofrece un ejemplo de utilizacin:

    $ vi append

    if test -w $2 -a -r $1 then cat $1 >> $2 else echo "No se puede aadir $1 a $2" fi

    ... $ append numerado a1 1 La orden expr permite evaluar expresiones aritmticas. Los operadores que admite son: +, -, *, / , %. El operador * hay que "escaparlo" para que el shell no lo interprete como el comodn. $ expr $num2 + 3 + 4 (OJO con los espacios!!!!!) $ expr 2 * 6 1.6 EL FICHERO PROFILE Cuando el shell se pone en ejecucin al iniciar una sesin, comienza por ejecutar un fichero de rdenes denominado .profile, que se encuentra en el directorio del usuario correspondiente. Este fichero contiene, tpicamente, rdenes para configurar el terminal tales como: $ eval tset -s Q $ stty erase ^H kill ^U y para establecer la ruta de defecto: PATH=.:/bin:/usr/bin:/usr/contrib/bin:/usr/local/bin:/usr/hosts y puede ser personalizado por cada usuario.