Académique Documents
Professionnel Documents
Culture Documents
SISTEMAS OPERATIVOS
Nombre Tutor
: ..............................................................
Nivel
Unidad
: ................................................................................................................
Tema
: ................................................................................................................
Integrantes
: ..............................................................
..............................................................
..............................................................
Informacin bsica:
El lenguaje shell-script es muy verstil aunque hay que advertir que es bastante ineficiente.
Son mucho ms eficientes los programas escritos en lenguaje C. Este es el lenguaje en el que
se escribi el kernel de Linux y otros muchos SO. El Bash no es tan eficiente como el C.
El valor del lenguaje shell-script es que permite hacer cosas complicadas con muy poco
esfuerzo en perfecta combinacin con una serie de comandos tambin muy potentes
disponibles en Linux
Herramientas / Preparacin:
Podr trabajar de forma individual, el instructor necesitar identificar la ubicacin de los
materiales de capacitacin como hardware o PC para los estudiantes. Sern necesarios los
siguientes recursos:
Pag. 1
Ejecute './pru_read'. Observe que los datos introducidos son guardados en la variable
NOMBRE. Si pulsa directamente la variable tomar valor "".
Cuando se usa la instruccin 'read' sin una variable el contenido se guardar en la variable
REPLY pero si lo que desea es guardar el contenido queda ms claro guardarlo en una
variable concreta. Ms adelante veremos ejemplos que usan esta instruccin.
Acabamos de utilizar una condicin que siempre se cumplir. Vamos a ver algo un poco ms
til.
# Si la variable CMPRT01 est definida y contiene el nombre de un fichero
# con permiso de lectura se mandar a la impresora con 'lp'
if test -r $CMPRT01
then lp $CMPRT01
fi
Tambin podemos programar una accin para cuando se cumpla una condicin y otra para
cuando no se cumpla.
Pag. 2
El siguiente ejemplo edtelo con el nombre 'tipofichero'. Nos servir para ilustrar el uso de 'elif' y
para repasar algunas de las opciones de 'test'.
# tipofichero
FILE=$1
if test -b $FILE
then echo $FILE 'Es un dispositivo de bloques'
elif test -c $FILE
then echo $FILE 'Es un dispositivo especial de caracteres'
elif test -d $FILE
then echo $FILE 'Es un directorio'
elif test -f $FILE
then echo $FILE 'Es un fichero regular (ordinario)'
elif test -L $FILE
then echo $FILE 'Es un Link simblico'
elif test -p $FILE
then echo $FILE 'Es un pipe con nombre'
elif test -S $FILE
then echo $FILE 'Es un Socket (dispositivo de comunicaciones)'
elif test -e $FILE
then echo $FILE 'Existe pero no sabemos que tipo de fichero es'
else echo $FILE 'No existe o no es accesible'
fi
Para usar este ltimo ejemplo ejecute './tipofichero ..' o './tipofichero tipofichero'
Tenga en cuenta que si bien la 'bash' admite el uso de 'elif' quizs otras shell no lo admitan.
Pag. 3
Por valor queremos indicar el resultado de cualquier expansin producida por la shell. La
_lista_de_patrones_ son uno o ms patrones separados por el carcter '|' y cada patrn es del
mismo tipo que los patrones utilizados para la expansin de nombres de ficheros.
El orden es importante porque se van comprobando por orden y en el momento que uno de los
patrones corresponda con el valor se ejecutar la _lista_de_ordenes_ que le corresponda y ya
no se ejecutar nada ms. Es frecuente utilizar en ltimo lugar un patrn '*)' para que en caso
de no encontrar ninguna correspondencia con los patrones anteriores se ejecute siempre una
accin por defecto. Edite el siguiente ejemplo y slvelo con nombre 'prueba_case'.
# prueba_case
case $1 in
1) echo Uno ;;
2) echo Dos ;;
[3-7]) echo "Entre tres y siete ambos incluidos" ;;
8|9|0) echo Ocho; echo Nueve; echo Cero ;;
[a-zA-Z]) echo Una Letra ;;
start|begin) echo Comienzo ;;
stop|end) echo Fin ;;
*) echo 'Fallo'
esac
Recuerde que la ejecucin de una orden externa en un shell-srcipt es una operacin costosa.
Hacer un script ineficiente puede no tener ninguna importancia dependiendo del uso que le
demos y de lo sobrada de recursos que est la mquina, pero en otros caso si ser ms
Pag. 4
importante as que haciendo las cosas lo mejor posible estaremos preparados en un futuro
para trabajos ms exigentes.
Cuando pulsemos <INTRO> directamente sin nada ms LINEA valdr "" y 'test $LINEA'
devolver FALSE y el bucle finalizar.
Vamos a ejecutar el ejemplo para comprobar su funcionamiento.
$ ./pru_while1
aaaaa
(aaaaa)
bbbbb
(bbbbb)
()
Pag. 5
El siguiente ejemplo no funcionar si no prepara un poco una serie de cosas que se necesitan.
Concretamente deber de existir un fichero 'lista' con varios elementos. Varios ficheros con
nombre que empiecen por SCAN. Varios ficheros '*.doc' de los cuales algunos debern
contener la palabra 'CODIGO'. Estudie el contenido del ejemplo que sigue.
Edtelo y ejectelo pasando varios argumentos. Su objetivo es hacerlo funcionar y entender
como funciona.
# Para ver distintos modos de manejar listas vamos a generar todos los
# nombres posibles formados por combinacin de las partes siguientes:
# Como parte 1 los nombres de ficheros de directorio actual que
# empiezan por 'SCAN'.
# Como parte 2 los nombres contenidos en el fichero 'lista'.
# Como parte 3 los identificadores 'cxx0 cxx2 bxx5'
# Como parte 4 la lista de parmetros $1 $2 $3 .. etc,
# Como parte 5 los ficheros '*.doc' que contienen la palabra 'CODIGO'.
###
for i in `ls SCAN*`
do
for j in `cat lista`
do
for k in cxx0 cxx2 bxx5
do
for l in $*
do
for m in `grep -l "CODIGO" *.doc`
do
echo $i.$j.$k.$l.$m
done
done
done
done
done
Cuando tengamos bucles unos dentro de otros decimos que son bucles anidados. El nivel de
anidamiento de un bucle es el nmero de bucles que hay unos dentro de otros.
Pag. 6
Pag. 7
#
#
#
#
######
#
#
#
#
#
#
####
# #
# #
# #
# #
####
#
#
#
#
#
#####
##
# #
# #
#####
#
#
#
#
Partiendo de esta utilidad realice un shell-script 'mi_banner.sh' que admita hasta tres
argumentos de tamao mximo de cuatro caracteres tal que el comando './mi_banner.sh hola
jose luis' obtenga:
Pag. 8
ooooooooo
oooooooo _/
_/
_/_/_/_/
_/
_/_/
ooooooo _/
_/ _/
_/ _/
_/ _/
oooooo _/_/_/_/_/ _/
_/ _/
_/
_/
ooooo _/
_/ _/
_/ _/
_/_/_/_/_/
oooo _/
_/ _/
_/ _/
_/
_/
ooo _/
_/
_/_/_/_/
_/_/_/_/_/ _/
_/
oo
ooooooooo
oooooooo
_/
_/_/_/_/
_/_/_/_/ _/_/_/_/_/_/
ooooooo
_/ _/
_/ _/
_/
oooooo
_/ _/
_/
_/_/_/_/
_/_/_/_/_/
ooooo
_/ _/
_/
_/ _/
oooo _/
_/ _/
_/ _/
_/ _/
ooo _/_/_/_/ _/_/_/_/
_/_/_/_/
_/_/_/_/_/_/
oo
ooooooooo
oooooooo _/
_/
_/
_/
_/_/_/_/
ooooooo _/
_/
_/
_/
_/
oooooo _/
_/
_/
_/
_/_/_/_/
ooooo _/
_/
_/
_/
_/
oooo _/
_/
_/
_/
_/
_/
ooo _/_/_/_/_/ _/_/ _/
_/
_/_/_/_/
oo
Ejercicio backup.sh
Un sencillo ejemplo es realizar un backup de solo ciertos directorios (prog_dir1 y prog_dir2),
luego comprimirlos usando bzip2 y enviarlos a un rea de almacenamiento (digamos una
unidad ZIP previamente montada en /mnt/zipdrive), y adems con que el nombre del archivo
contenga la fecha del da. Suena difcil? Realmente no lo es.
Se crea un archivo texto con cualquier nombre, por ejemplo mibackup que contenga las
instrucciones que se desea ejecutar.
#!/bin/sh
#
echo "---------- Captura fecha -----------"
fecha=`date +%Y%m%d`
#
echo "---------- Haciendo Tar -----------"
tar cvf backup$fecha.tar prog_dir1 prog_dir2
#
echo "----------- Comprimiendo -----------"
bzip2 backup$fecha.tar
#
echo "---------- Envindolos a zip -------"
cp ./backup$fecha.tar /mnt/zipdrive
#
echo "----------- Limpiando --------------"
rm -f ./backup$fecha.tar
#
echo "----------- Final
-------------"
Luego, se le asigna permisos de ejecucin con el comando chmod +x mibackup y esta listo
para ser ejecutado.
Pag. 9
Ejercicio piramide.txt
Realice un shell-scrip 'piramide.sh' que admita como argumento un nmero 'N' y que obtenga la
salida una serie de 'N' filas de forma triangular.
Para ./piramide.sh 12 la salida sera.
01
02 02
03 03 03
04 04 04 04
05 05 05 05 05
06 06 06 06 06 06
07 07 07 07 07 07 07
08 08 08 08 08 08 08 08
09 09 09 09 09 09 09 09 09
10 10 10 10 10 10 10 10 10 10
11 11 11 11 11 11 11 11 11 11 11
12 12 12 12 12 12 12 12 12 12 12 12
Ejercicio vigila.txt
Realizar un shell-script que escriba en el fichero '/tmp/usuarios' una lnea con la fecha y otra
con el nmero de usuarios distintos que estn conectados en ese momento cada dos minutos.
CONCLUSIONES
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
BIBLIOGRAFA.
1. STEVE Shah, Manual de administracin de Linux, Osborne McGraw-Hill. Espaa, 2001.
2. SCO UNIX System V/386 Operating System, System Administrators Guide.
Pag. 10