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”;;
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 $?
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” ]
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ó
¿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.)
|| 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 &&
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
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)
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
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
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
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.)
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
$ 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)
$ 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)
Preguntas
?
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.
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]”
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.
Top Related