20
Programación II Ing. Diego J. Arcusin [email protected] 5 – Programación con Shell

Programación II

  • Upload
    isha

  • View
    29

  • Download
    0

Embed Size (px)

DESCRIPTION

5 – Programación con Shell. Programación II. Ing. Diego J. Arcusin [email protected]. CASE. La proposición case. Sintáxis: case palabra in patrón )comandos;; patrón )comandos;; ... esac - PowerPoint PPT Presentation

Citation preview

Page 1: Programación II

Programación II

Ing. Diego J. Arcusin [email protected]

5 – Programación con Shell

Page 2: Programación II

CASE

La proposición case. Sintáxis:

case palabra in

patrón) comandos;;

patrón) comandos;;

...

esac

Compara la palabra con los patrones en sentido descendente y ejecuta los comandos

asociados al primer patrón que se reconozca y sólo a ese patrón. Este ejemplo, indica el Shell en uso:

case $SHELL in

/bin/sh) echo “Usted está usando el Bourne Shell”;;

/bin/ksh) echo “Usted está usando el Korn Shell”;;

/bin/csh) echo “Usted está usando el C Shell”;;

/bin/rsh) echo “Usted está usando el Restricted Shell”;;

*) echo “Usted está usando un Shell desconocido”;;

Page 3: Programación II

IF La proposición if de shell ejecuta comandos basados en la condición de terminación

de un comando. Sintáxis:

if comando

then

comandos si la condición es verdadera

else

comandos si la condición es falsa

fi La parte else es opcional Todo comando devuelve una condición de terminación: una valor retornado al shell

para indicar qué sucedió. Por convención, 0 significa “verdadero” (el comando

ejecutó bien) y no cero significa “falso” (el comando no ejecutó correctamente). el Shell guarda la condición de terminación del último comando en la variable $?

Page 4: Programación II

El comando test

Permite verificar la existencia de archivos y ciertas condiciones de los mismos. Además permite la comparación de valores.

La única finalidad del comando test es devolver una condición de terminación.

Algunas opciones:test “$1” = cadena Verifica si el primer parámetro es igual a “cadena”test int1 -eq int2 Verifica si el el entero int1 es igual al entero int2test –f archivo Verifica si existe el archivo y no es un directoriotest –d archivo Verifica si existe el archivo y es un directoriotest –r archivo Verifica si existe el archivo y si puede leersetest –w archivo Verifica si existe el archivo y si puede escribirse

Si test no está predefinido en el Shell (es un comando aparte) es más eficiente el uso de case que el de un if con un test en la condición.

Test se puede resumir mediante: [ expresión ]. Por ejemplo:test –f “$1” es igual que [ -f “$1” ]

Page 5: Programación II

Ejemplo: Comado “which”

$ cat which

# which cmd: Indica cuál comando de PATH se ejecuta

case $# in

0) echo ‘Uso: which commando’ 1>&2; exit 2

esac

for i in `echo $PATH | sed ´s/:/ /g´`

do

if test –x $i/$1

then

echo $i/$1

exit 0; #Se encontró

fi

done

exit 1 #No se encontró

Page 6: Programación II

¿Qué ocurriría si tenemos en nuestro directorio de trabajo otro

programa llamado echo que hace otra cosa, y en la variable

$PATH tenemos el directorio . primero? Dos soluciones posibles:

i) Utilizar los comandos con su ruta completa. Por ejemplo: /bin/echo ii) Redefinir la variable PATH dentro del SCRIPT incluyendo sólo los

directorios necesarios.

¿Qué ocurre con la variable PATH original?

Ejemplo: Comado “which” (cont.)

Page 7: Programación II

|| es un operador condicional que significa OR (Disyunción).

Sintáxis: $ comando1 || comando2

El comando a la izquierda se ejecuta; si la condición de

terminación es cero (éxito), el comano a la derecha de || se ignora.

Si la condición de terminación es no cero (fracaso) el lado

derecho se ejecuta y el valor de la expresión completa es la

condición de terminación del lado derecho. De forma similar && es un operador condicional que significa AND

(conjunción): ejecuta el comando de la derecha sólo si el de la

izquierda tiene éxito.

Los comandos || y &&

Page 8: Programación II

Así como vimos que el comando for ejecuta un conjunto de comandos una vez para

cada elemento de un conjunto de palabras, los ciclos while y until usan la condición de

terminación de un comando para controlar la condición de terminación de un comando

para controlar la ejecución de comandos en el cuerpo del ciclo.

El cuerpo del ciclo se ejecuta hasta que el comando de la condición de no-cero (para

while) o de cero (para until).

Sintáxis:

while comando

do

cuerpo del ciclo ejecutado mientras el comando devuelva verdadero

done

until comando

do

cuerpo del ciclo ejecutado mientras el comando devuelve falso

done

While y Until

Page 9: Programación II

while sleep 60 # Hace una espera de 60’ y luego

do # verifica si carlos está en sesión

who | grep carlos

done

until who | grep carlos # Si carlos está logueado lo

muestra y

do # espera 60 segundos para un

nuevo

sleep 60 # control (¡Más eficiente! sólo

ejecuta donde # el sleep si carlos está en sesión)

While y Until (Ejemplo)

Page 10: Programación II

El comando integrado de shell shift mueve la lista completa de

argumentos una posición hacia la izquiera: $2 se convierte en $1, $3 en

$2, etc. “$@” proporciona todos los argumentos (después del comando shift),

a semejanza de $*. Por ejemplo estos dos ciclos son equivalentes:

for i in $* for i in $*

do do

echo $i echo $1

done shift

done

El comando shift

Page 11: Programación II

Reglas para la evaluación de variables de Shell $var Valor de var o Nada si var no está definida ${var} Idem anterior, útil si la variable está mezclada dentro

de una cadena alfanumérica. ${var-algo} Valor de var si está definido; de lo contrario algo

$var no cambia. ${var=algo} Valor de var si está definido; de lo contrario algo

Si no está definido, a $var se le asigna algo ${var?mensaje} Valor de var si está definido; de lo contrario se imprime

mensaje y abandona el shell. Si mensaje está vacío

muestra:

var: parameter not set. ${var+algo} algo si $var está definido, de lo contrario nada

Evaluación de variables

Page 12: Programación II

El comando trap establece una secuencia de comandos que se ejecutan al producirse una seña. Sintáxis:

$ trap secuencia-de-comandos números de señal

La secuencia de comandos es un argumento individual, por lo cuál casi siempre irá entre delimitadores. Los números de señal son enteros pequeños que identifican la señal de acuerdo a la siguiente lista: 0 Salida del shell (Por cualquier razón incluyendo fin de archivo) 1 Corte 2 Interrupción (Tecla suprimir) 3 Abandonar (Ctrl-\; hace que el programa produzca una vaciado de memoria 9 Cancelar (No puede detectarse ni ignorarse) 15 Terminar, señal por default generada por kill

Por ejemplo: Util para incluir una instrucción para borrar un archivo temporal en el caso de que se produzca una interrupción a un script:trap ‘rm –f $ARCHIVOTEMPORAL: exit 1’ 1 2 15...

Traps: Detección de interrupciones

Page 13: Programación II

La secuencia de comandos que forma el primer argumento de trap se parece a una llamada a una subrutina que se presenta de inmediato al producirse la señal.

Cuando finalizan las instrucciones asociadas a la señal, el programa se reanudará donde había quedado interrumpido a menos que la señal lo cancele explicitamente mediante exit.

La secuencia nula de comandos significa ‘ignorar las interrupciones’ en este proceso y sus hijos. Ejemplo:$ ( trap ‘ ‘ 1; comando-largo ) &

La señal –9 no puede detectarse ni detenerse es por eso que:kill –9 identificador-de-proceso siempre cancela el proceso no así kill identificador-de-proceso ya que puede contar con algún trap que ignore la señal.

Traps (Cont.)

Page 14: Programación II

Todas las variables del Shell Bourne se almacenan en forma de cadenas de caracteres.

Para poder realizar operaciones aritméticas y lógicas con números enteros es preciso

traducirlos a enteros, y hay que volver a traducir el resultado a una cadena de caracteres

para almacenarla correctamente en una variable shell. Para esto se utiliza el comando expr Sintáxis:

expr argumentos Evalúa los argumentos de la expresión y envia el resultado a la salida estándar. Operadores

=, \>, \>=, \<, \<=, != Operadores de comparación

+, -, \*, /, % Operadores de aritmética entera

\| Proporciona la 1era expresión si no es nula o 0, de lo

contrario, proporciona la segunda expresión.

\& Proporciona la 1era expresión si ninguna es nula o 0,

de lo contrario, proporciona 0.

Los metacaracteres del shell como * deben ir precedidos de la barra invertida.

Datos Numéricos. comando expr

Page 15: Programación II

$ cat contarif [ $# != 1 ]

thenecho “Uso: $0 argumento-entero”exit 1

fimaximo = “$1” # Fijamos el número pasado como parámetroactual = 1 # Primer número while [ $actual –le $maximo ]do

echo “$actual \c”actual=`expr $actual + 1`

doneechoexit 0

$contar 51 2 3 4 5$

Comando expr (Ejemplo)

Page 16: Programación II

$ cat sumadorif [ $# = 0 ]

thenecho “Uso: $0 lista de números”exit 1

fisuma = 0 # Fijamos el acumulador en cerowhile [ $# != 0 ]do

suma=`expr $suma + $1`shift

doneecho “La suma es: $suma”exit 0$

Comando expr (Otro ejemplo)

Page 17: Programación II

Preguntas

?

Page 18: Programación II

Ejercicios

5.1. a) Desarrollar un Shell Script que busque ordenadamente el nombre de un comando (que se recibe como parámetro) en cada uno de los directorios de la variable $PATH e indica la ruta completa del que se ejecutaría al imbocarlo. b) Incorpore una breve descripción del comando en la caso de que el mismo tenga página de manual.

5.2. Elabore un script que reciba un directorio como parámetro y analice todo el árbol de archivos y directorios debajo del mismo y produzca la siguiente información:a) Cantidad de archivos de los que disponemos permiso de lectura.b) Cantidad de archivos de los que disponemos permiso de escritura.c) Cantidad de archivos de los que disponemos permiso de ejecución.d) Cantidad de directorios de los que disponemos permiso de lectura.e) Cantidad de directorios de los que disponemos permiso de escritura.f) Cantidad de directorios de los que disponemos permiso de ejecución.g) Cantidad de archivos de dispositivos encontrados.h) Cantidad de archivos con SUID encontrados.

Page 19: Programación II

Ejercicios

5.3. a) Desarrolle un Shell Script que reciba como parámetros pares formados por “comando” y “descripción” y que construya un menú de opciones donde cualquiera de los comandos pueda ser ejecutado seleccionando la descripción correspondiente.b) Desarrolle una segunda versión de este programa que toma la lista de comandos y descripciones de una archivo con cada par en cada línea separados por :

5.4.) Elaborar un Shell Script que reciba como parámetros n números de 1 a 75. Por cada argumento recibido, imprimir una línea con un caracter a elección tantas veces como indique el número.

5.5) Crear un Shell Script llamado “promedio” que calcule el promedio de todos los números recibidos cómo parámetro.

5.6) Incorpore un saludo de bienvenida al .profile. de acuerdo al siguiente criterio:de 06:00 a 13:00 hs. “Buenos días [su nombre de usuario]”de 13:00 a 19:00 hs. “Buenos tardes [su nombre de usuario]”de 19:00 a 06:00 hs. “Buenas noches [su nombre de usuario]”

Page 20: Programación II

Ejercicios

5.7. Modifique el comando which para que acepte más de un comando de entrada.

5.8. Desarrollar un script que reciba como parámetro un directorio. Verificar que el mismo existe y devolver la suma de los tamaños de todos los archivos que se encuentran en ese directorio.