Está en la página 1de 10

Programacin Shell 2/3

SISTEMAS OPERATIVOS
Nombre Tutor

: ..............................................................

Nivel

: ................. Paralelo: ........... Seccin: .................. Fecha: ...............

Unidad

: ................................................................................................................

Tema

: ................................................................................................................

Integrantes

: ..............................................................
..............................................................
..............................................................

Prctica de laboratorio SHELL Estructuras de control


Duracin estimada: 90 min.
Objetivos:
Aprender las estructuras de control para automatizar tareas utilizando los comandos bsicos
para la manipulacin de ficheros y directorios dentro de un determinado Sistema Operativo, en
este caso Linux.

Entrada de datos con read


Sentencia condicional 'if'
Sentencia condicional 'case'
Bucles 'while' y 'until'
Bucle 'for'
'break' y 'continue'

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:

PC con monitor, teclado, ratn y cables de alimentacin


Sistema operativo Linux (Red Hat, SuSe, Mandrake, Caldera, etc)
instalado en el PC

Paso 1 Entrada de datos con read


La instruccin 'read' permite capturar datos desde la entrada estndar. Para ello queda a la
espera de un fin de lnea. Edite el fichero siguiente y llmelo 'pru_read'.

Sistemas Operativos Msc. Washington Ramrez M.

Pag. 1

Programacin Shell 2/3


echo -e "Introduzca su nombre : \c"
read NOMBRE
banner Hola $NOMBRE

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.

Paso 2 Sentencia condicional 'if'


Ya hemos visto una forma de hacerlo usando los operadores '||' o '&&' de la shell, pero existen
formas que pueden resultar ms verstiles y ms legibles.
if _condicin_
then _lista_de_ordenes_
[ elif _condicin_
then _lista_de_ordenes_ ] ...
[ else _condicin_ ]
fi
En lugar de _condicin_ podramos haber puesto _lista_de_ordenes_ pero queremos resaltar
que el cdigo de retorno va a ser evaluado.
Las partes entre corchetes son opcionales y si van seguidas de tres puntos '...' indica que
puede presentarse varias veces. Todas las sentencias condicionales 'if' empiezan con la
palabra reservada 'if' y terminan con la palabra reservada 'fi'.
Mejor vamos a ilustrar con algunos ejemplos. Deber editarlos y ejecutarlos.
# Esto siempre mostrara '123'
if true
then echo '123'
fi

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.

Sistemas Operativos Msc. Washington Ramrez M.

Pag. 2

Programacin Shell 2/3


# Si La variable 'modo' contiene el valor 'lp' imprimir el fichero $FICH
# en caso contrario sacarlo por pantalla.
if [ "$modo" = "lp" ]
then lp $FICH
else cat $FICH
fi

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.

Paso 3 Sentencia condicional 'case'


Ya hemos visto que con 'elif' podemos evaluar distintas condiciones programando una accin
para cada caso.
Existe un caso especial. Imaginemos que deseamos evaluar una variable y en funcin de lo
que contenga hacer una cosa u otra. Podramos usar una sentencia condicional con
abundantes 'elif' pero hay que tener en cuenta una cosa. Con 'elif' tenemos que ir evaluando a
cada paso hasta que se cumpla una vez y entonces se ejecuta la accin y ya no se ejecuta
ninguna otra porque habremos finalizado. En el caso anterior si hubiramos introducido el
nombre de un pipe con nombre se habran ejecutado varios test antes de determinar que era
un pipe con nombre, y eso resulta lento.
Si lo que deseamos hacer est en funcin de un valor utilizaremos la sentencia condicional
'case' que es mucho ms eficiente porque no requiere ejecutar varias ordenes o una orden
varias veces como en el caso anterior.
La sintaxis para la sentencia condicional 'case' sera de la siguiente forma:
case valor in
[ _lista_de_patrones_ ) _lista_de_ordenes_ ;; ] ...
esac

Sistemas Operativos Msc. Washington Ramrez M.

Pag. 3

Programacin Shell 2/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

Ahora le damos permiso de ejecucin y probamos como funciona.


$ ./prueba_case 1
Uno
$ ./prueba_case 2
Dos
$ ./prueba_case 7
Entre tres y siete ambos incluidos
$ ./prueba_case h
Una Letra
$ ./prueba_case start
Comienzo
$ ./prueba_case begin
Comienzo
$ ./prueba_case aa
Fallo
$ ./prueba_case 12
Fallo
$ ./prueba_case 9
Ocho
Nueve
Cero
$ ./prueba_case stop
Fin

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

Sistemas Operativos Msc. Washington Ramrez M.

Pag. 4

Programacin Shell 2/3

importante as que haciendo las cosas lo mejor posible estaremos preparados en un futuro
para trabajos ms exigentes.

Paso 4 Bucles 'while' y 'until'


while _condicin_
do
_lista_de_ordenes_
done
En lugar de _condicin_ podramos haber puesto _lista_de_ordenes_ pero queremos resaltar
que el cdigo de retorno va a ser evaluado.
Mientras se cumpla la condicin se ejecutar _lista_de_ordenes_. Resulta evidente que si
dentro de la _lista_de_ordenes_ no hay nada capaz de alterar la condicin, resultar un bucle
que se ejecutar de forma ininterrumpida. (Bucle infinito). Si esto ocurre habr que matar el
proceso enviando alguna seal.
Existe un bucle muy similar y que solo se diferencia en que no para nunca hasta que se cumpla
la condicin. Es decir justo al revs que antes.
until _condicin_
do
_lista_de_ordenes_
done
Edite como 'pru_while1' el siguiente ejemplo.
# pru_while1
# Hacer un bucle de captura por consola (terminara cuando se pulse
# solo <INTRO> ) y mostrar el resultado de cada captura entre parntesis.
# Inicializamos primero la variable LINEA con un valor cualquiera
# pero distinto de ""
LINEA="x"
while test $LINEA
do
read LINEA
echo '('$LINEA')'
done

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)
()

Sistemas Operativos Msc. Washington Ramrez M.

Pag. 5

Programacin Shell 2/3

Vemos que en la ltima ejecucin LINEA vala "".

Paso 5 Bucle 'for'


Se proporciona una lista de elementos y se ejecuta una lista de rdenes haciendo que una
variable vaya tomando el valor de cada uno de estos elementos. Entre estas rdenes se puede
utilizar un nuevo bucle 'for'.
El siguiente ejemplo funciona pero es una mala idea ya que supone Varias ejecuciones de un
comando cuando se poda haber hecho con uno solo. Habra sido mejor hacer 'chmod +x *'.
for i in $*
do
chmod +x $i
done

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.

Sistemas Operativos Msc. Washington Ramrez M.

Pag. 6

Programacin Shell 2/3

Paso 6 'break' y 'continue'


Existe una forma de controlar un blucle desde el interior del mismo. Para eso podemos usar
'break', o 'continue'. Se pueden usar en cualquiera de los bucles que acabamos de ver (while,
until, y for).
La palabra reservada 'break' provoca la salida de un bucle por el final. Si viene seguido de un
numero 'n' saldr de 'n' niveles. No poner nmero equivale a poner el nmero 1.
La palabra reservada 'continue' provoca un salto al comienzo del bucle para continuar con la
siguiente iteracin. Si viene seguida de un numero 'n' saldr de 'n' niveles.
# pru_break_continue
# Definir la variable j como una variable de tipo entero e inicializarla a
# cero. Luego la incrementamos a cada iteracin # del bucle y si j es
# menor que diez mostramos el doble de su valor y en caso contrario
# salimos del bucle
typeset -i j=0
while true
do
let j=j+1
if [ $j -et 3 ]
then continue
fi
if [ $j -et 4 ]
then continue
fi
if [ $j -lt 10 ]
then expr $j \* 2
else break
fi
done

Probamos ahora a ejecutarlo y obtendremos


$ ./pru_break_continue
2
4
10
12
14
16
18

Ahora edite y pruebe el siguiente ejemplo que llamaremos 'pru_break_continue2'

Sistemas Operativos Msc. Washington Ramrez M.

Pag. 7

Programacin Shell 2/3


# ./pru_break_continue2
for i in uno dos tres
do
for j in a b c
do
for k in 1 2 3 4 5
do
echo $i $j $k
if [ "$j" = "b" ]
then break
fi
if [ "$k" = "2" ]
then continue 2
fi
done
done
done

El resultado de la ejecucin sera como sigue.


$ ./pru_break_continue2
uno a 1
uno a 2
uno b 1
uno c 1
uno c 2
dos a 1
dos a 2
dos b 1
dos c 1
dos c 2
tres a 1
tres a 2
tres b 1
tres c 1
tres c 2

Paso 7 Resolver los siguientes tems


Ejercicio mi_banner.txt
Localice en su sistema la utilidad 'banner' para consola. Puede haber ms de una utilidad para
esto y algunas estn pensadas para su uso con impresora. Nos interesa la utilidad 'banner'
para terminal de forma que el comando 'banner hola' genere la siguiente salida:

#
#
#
#
######
#
#
#
#
#
#

####
# #
# #
# #
# #
####

#
#
#
#
#
#####

##
# #
# #
#####
#
#
#
#

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:

Sistemas Operativos Msc. Washington Ramrez M.

Pag. 8

Programacin Shell 2/3

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.

Sistemas Operativos Msc. Washington Ramrez M.

Pag. 9

Programacin Shell 2/3

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.

Sistemas Operativos Msc. Washington Ramrez M.

Pag. 10

También podría gustarte