Descargar

Programación con Shell

Enviado por Pablo Turmero


    edu.red 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”;;

    edu.red 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 $?

    edu.red 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 int2 test –f archivo Verifica si existe el archivo y no es un directorio test –d archivo Verifica si existe el archivo y es un directorio test –r archivo Verifica si existe el archivo y si puede leerse test –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” ]

    edu.red 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ó

    edu.red ¿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.)

    edu.red || es un operador condicional que significa OR (Disyunción).Sintáxis: $ comando1 || comando2El 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 &&

    edu.red 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

    edu.red 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)

    edu.red 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

    edu.red 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

    edu.red 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

    edu.red 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.)

    edu.red 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

    edu.red $ cat contar if [ $# != 1 ] then echo “Uso: $0 argumento-entero” exit 1 fi maximo = “$1” # Fijamos el número pasado como parámetro actual = 1 # Primer número while [ $actual –le $maximo ] do echo “$actual c” actual=`expr $actual + 1` done echo exit 0 $contar 5 1 2 3 4 5 $ Comando expr (Ejemplo)

    edu.red $ cat sumador if [ $# = 0 ] then echo “Uso: $0 lista de números” exit 1 fi suma = 0 # Fijamos el acumulador en cero while [ $# != 0 ] do suma=`expr $suma + $1` shift done echo “La suma es: $suma” exit 0 $ Comando expr (Otro ejemplo)

    edu.red Ejercicios 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. 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.

    edu.red Ejercicios 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 : 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) Crear un Shell Script llamado “promedio” que calcule el promedio de todos los números recibidos cómo parámetro. 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]”

    edu.red Ejercicios 7. Modifique el comando which para que acepte más de un comando de entrada. 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.