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 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” ]
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 || 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 &&
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 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)
$ 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)
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.
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]”
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.