Está en la página 1de 12

Laboratorio de Sistemas Operativos

Pgina: 1

UNIVERSIDAD CATLICA DE SANTA MARA


PROGRAMA PROFESIONAL DE INGENIERA DE SISTEMAS

SESIN 6:

Programacin de Shell Scripts en Linux


I
OBJETIVOS

Manipular, trabajar y explicar acerca de la construccin de shells scripts en Linux


Realizar ejercicios.

II
TEMAS A TRATAR

Operaciones aritmticas
Comando test
Estructuras controladas
Uso de funciones

III
MARCO TEORICO
Operaciones Aritmticas
El comando 'expr' se usa en condicionales tanto simples como mltiples, o para
simplemente hacer operaciones aritmticas. Los operadores son los tpicos de
operaciones aritmticas: suma (+), resta (-), multiplicacin (\*), divisin (/) y modulo
(%).
Sintaxis: expr [operando1] operador [operando2]

Evaluacin de cadenas
Para evaluar cadenas, ya sean cadenas de texto, ficheros, o nmeros, tenemos el comando
'test' el cual nos permite de una forma rpida y fcil comparar o comprobar cualidades o
valores de las cadenas evaluadas.
Este comando se suele abreviar usando solo corchetes: [cadena valor cadena] y
suprimiendo el propio comando 'test', dentro de un 'if', 'case', 'until', 'for' etc. o
simplemente para definir una variable.
Mgter. Karim Guevara Puente de la Vega, Ing. Eveling Castro Gutierrez

Sesin 06

Laboratorio de Sistemas Operativos

Pgina: 2

Modos de evaluar con 'test'.


a) Evaluando ficheros.
-f
-e
-s
-r
-w
-x
-d
-L

si el fichero es ordinario.0 si es verdadero y 1 si es falso.


si el fichero existe.0 si es verdadero y 1 si es falso.
si el fichero existe y no esta vaco.0 si verdad, 1 si falso.
si tiene permiso de lectura.0 verdad, 1 falso.
si tiene permiso de escritura.0 verdad, 1 falso.
si tiene permiso de ejecucin.0 verdad, 1 falso.
si es directorio. 0 verdad, 1 falso.
si es un enlace simblico. 0 verdad, 1 falso.

Estos parmetros se pueden unir usando los enlazadores:


-a
and, 'y'.
-o
or, 'o'.
!
not, no.

b) Evaluacin de cadenas de texto.


Para evaluar cadenas de texto tenemos los parmetros:
'='
igual
'!='
distinto

c) Evaluacin de nmeros
Para evaluar nmeros, tenemos las siguientes opciones o parmetros:
-lt
menor que ...
-le
menor o igual
-gt
mayor que ...
-ge
mayor o igual
-eq
igual
-ne
no igual

Estructuras Controladas
Existen dos estructuras primarias para controla la programacin del shell: estructuras de
decisin y estructuras iterativas.
1. Estructura if
La estructura ifthenelsefi es una estructura de decisin que le permite
seleccionar entre dos posibilidades de accin, segn el resultado de un comando. La
sintaxis es:
if condition ;
then
statement;
...
else
statement;
...
fi

Mgter. Karim Guevara Puente de la Vega, Ing. Eveling Castro Gutierrez

Sesin 06

Laboratorio de Sistemas Operativos

Pgina: 3

2. case
La estructura case es una estructura de decisin que le permite seleccionar una entre
varias posibilidades de accin, segn el valor de una variable. Su sintaxis es:
case word in
pattern) statement(s);;
pattern) statement(s);;
...
...
esac

el parmetro word se compara con cada uno de los parmetros pattern. Las
instrucciones se ejecutan si word coincide con un patrn, se termina con dos signos
;. El final de la instruccin case viene marcada por la palabra clave esac.
3. Uso de estructuras iterativas
Las estructuras iterativas de control le permiten escribir archivos de secuencias que
contienen bucles como son for y while.
Estructura for
for x in a b c
do
command;
command;
...
done

Estructura while
while condition
do
command;
command;
...
...
done

Estructura until
Comando 'until'.'hasta' Negacin de while.
until [ condicin ]
do
command;
done

Funciones
Una funcin es un trozo de cdigo que se utilizara con frecuencia en un script, y que solo
varia en una variable. Sintaxis:
nombre_funcion() {
cdigo a ejecutar en la funcin
}

Mgter. Karim Guevara Puente de la Vega, Ing. Eveling Castro Gutierrez

Sesin 06

Laboratorio de Sistemas Operativos

Pgina: 4

IV
ACTIVIDADES
1. Trabajando con expresiones aritmticas:
El siguiente ejemplo nos permite comprender como se debe de expresar una
operacin aritmtica
#Ejemplo de expr (el cuadrado de un numero)
echo "Dame un numero."
read numero
resultado=`expr $numero \* $numero`
echo "El resultado de el cuadrado de $numero es $resultado"

La salida del script sera la siguiente:


$ . script5
Dame un numero.
6
El resultado del cuadrado de 6 es 36
$

2. Nmeros aleatorios
Para generar un nmero aleatorio se utiliza la variable $RANDOM. Esta genera un
nmero aleatorio de entre 1 y 32000.
Por ejemplo, el siguiente script genera un nmero aleatorios hasta 48:
# aleatorio con random
alea=`expr $RANDOM % 49` # generamos un numero
aleatorio1=`expr $alea + 1`# nos aseguramos que no sea 0 sumndole 1
alea=`expr $RANDOM % 49` # el segundo ..
aleatorio2=`expr $alea + 1`
alea=`expr $RANDOM % 49`
aleatorio3=`expr $alea + 1`
alea=`expr $RANDOM % 49`
aleatorio4=`expr $alea + 1`
alea=`expr $RANDOM % 49`
aleatorio5=`expr $alea + 1`
alea=`expr $RANDOM % 49`
aleatorio6=`expr $alea + 1`
echo "Copia estos numeros:"
echo " $aleatorio1 - $aleatorio2 - $aleatorio3 "
echo " $aleatorio4 - $aleatorio5 - $aleatorio6 "

La salida sera algo parecido a esto:


$ . aleatorio
Copia estos numeros:
24 - 2 29
6 - 33 11
$

3. Aritmtica integrada
El shell provee un mecanismo para realizar aritmtica de enteros bsica llamado
"expansin aritmtica". Este tipo de expansin no est disponible en shells mas
Mgter. Karim Guevara Puente de la Vega, Ing. Eveling Castro Gutierrez

Sesin 06

Laboratorio de Sistemas Operativos

Pgina: 5

antiguos (como Bourne shell, donde se tiene que utilizar el comando expr). La
expansin aritmtica est basada en un estndar POSIX, as que es posible encontrar
esta caracterstica en la mayora de shells modernos.
El formato para la expansin aritmtica es:
$((expresion))

En donde expresin es cualquier expresin matemtica que puede usar variables de


shell (que contengan valores numricos), operadores y/o valores numricos
especficos.
El resultado del clculo de la expresin es regresado en la lnea de comando, por
ejemplo:
$echo $((i+1))

Adiciona uno al valor de la variable i y despliega el resultado. Hay que notar que la
variable i no tiene que ser precedida por el signo $, esto es porque el shell sabe que
las nicas cuestiones vlidas en una expansin aritmtica son valores, variables y
operadores (+ - * /), entonces, al evaluar el carcter i y definir que no es un valor
numrico (0 a 9) ni un operador matemtico, entonces seguramente es una variable.
Si la variable no ha sido definida o su valor es nulo (contiene una cadena nula,
espacios o valores alfanumricos) se define que el valor de la variable es cero. Por
ejemplo, an cuando no hemos definido la variable Z ni asignado ningn valor a la
misma, aun se puede utilizar en una expansin aritmtica:
$echo $((Z+10))
10
$

o en la siguiente:
$ echo $((Z=Z+1))
1
$

La asignacin de valor (=) es un operador aritmtico vlido y el valor del clculo es


asignado a la variable.
Se permite el uso de parntesis adicionales para forzar agrupacin de operaciones,
por ejemplo:
$echo $((i=(i+10) * j))

Si se desea realizar una asignacin sin el comando echo, se mueve la asignacin de


datos (el signo de igual) antes de la expansin aritmtica.
$ total=$((1 * 10))
$ echo $total
10
$

Finalmente, para hacer una comparacin de valores dentro de la asignacin, digamos,


ver si el valor de una variable es mayor que 0 o menor o igual que 100, podemos
escribir:
$ resultado=$(( i >0 && i <=100 ))
Mgter. Karim Guevara Puente de la Vega, Ing. Eveling Castro Gutierrez

Sesin 06

Laboratorio de Sistemas Operativos

Pgina: 6

Lo cual asigna el valor 1 a la variable resultado si la expresin es cierta y 0 si es falsa.


4. Comando test
Como se menciono este comando nos permite evaluar cadenas. Veamos algunos
ejemplos:
Ejemplo:
# ejemplo de test
test $1 = $2
echo $?

Si lo ejecutamos as:
$ . script6 uno uno
0
$

En caso de que introduzcamos dos argumentos distintos:


$ . script6 paquito paquita
1
$

Ahora modifiquemos el script anterior de la siguiente manera:


# ejemplo de test con corchetes
[ $1 = $2 ]
echo $?

Y volvamos a ejecutarlo de la misma forma. Vera que es lo mismo poner los


corchetes que la palabra test.
5. Mas ejemplo
a) Veamos un ejemplo de evaluacin de ficheros:
# evaluacin de ficheros con test.
[ -f $1 ] # damos ruta relativa o absoluta del fichero.
echo $?

Probemos con uno de nuestros scripts:


$ . script7 script1
0
$

O:
$ . script7 script10
1
$

b) En el siguiente ejemplo estamos evaluando una cadena de texto,


# evaluacin de ficheros con test.
[ $1 != $2 ] # al lanzar el script damos dos cadenas de texto
echo $?

Mgter. Karim Guevara Puente de la Vega, Ing. Eveling Castro Gutierrez

Sesin 06

Laboratorio de Sistemas Operativos

Pgina: 7

c) En este ejemplo adivinaremos un nmero aleatorio, el cual ser evaluado:


# adivinador con evaluacin numrica
echo "Adivina mi numero"
read adiv
aleatorio=`date +%S` #creamos un numero aleatorio en segundos de 0 a 59
aleatorio=`expr $aleatorio % 5` # lo reducimos a su modulo 5 (de 0 a 4)
[ $aleatorio -eq $adiv ]
echo $?.

Ejecutando el script:
$ . adivinador
Adivina mi numero:
3
0
$ . adivinador
Adivina mi numero:
2
1
$

d) Veamos un ejemplo con el script anterior para ver el uso del if:
# adivinador mejorado con if
echo "Adivina mi numero:"
read adiv
aleatorio=`date +%S`
aleatorio=`expr $aleatorio % 5`
if [ $aleatorio -eq $adiv ] ;
then
echo "has acertado!!"
else
echo "has errado!!"
fi

Si lo ejecutamos:
$ . adivinador2
Adivina mi numero:
3
has errado!!
$

e) Otro ejemplo, en el que se evala ficheros:


# Este script evala dos ficheros dados de forma estatica
# diciendonos cual es mayor en tamao.
uno=`ls -l $1
dos=`ls -l $2
if [ $uno -gt
then
echo "
else
echo "
fi

| tr -s " " | cut -f5 -d " "`


| tr -s " " | cut -f5 -d " "`
$dos ] ;
$1 es mayor "
$2 es mayor "

Si ejecutamos nuestro script, evaluando por ejemplo dos de los script que hemos
creado hasta ahora:
$ . ficheromayor /home/g100/script1 /home/g100/script7
/home/g100/script7 es mayor
$

Mgter. Karim Guevara Puente de la Vega, Ing. Eveling Castro Gutierrez

Sesin 06

Laboratorio de Sistemas Operativos

Pgina: 8

f) Un ejemplo ms:
archivo="archivo_no_existe"
if [ -f $archivo ]; then
echo "el archivo $archivo no existe"
else
echo "el archivo $archivo si existe"
fi

g) Se muestra a continuacin una estructura de un programa de men abreviado:


#Nombre: shrtMenu.sh
#Objetivo: permite al usuario copiar, eliminar un archivo, o salir de un
programa
#Visualizacin del men
echo Por favor seleccione C, E o S para
echo [C]opiar un archivo
echo [E]liminar un archivo
echo [S]alir del programa
#Obtiene respuesta del usuario
read response
case $response in
C|c)
echo Nombre del archivo a copiar
read filename
echo Nombre del archivo destino
read destfile
cp $filename $destfile;;
E|e)
echo Nombre del archivo a eliminar
read filename
rm $filename;;
*)
echo Salir ahora;;
esac

Para ejecutar el script escribimos:


$ . shrtMenu.sh

h) Lo siguiente nos muestra un script en el cual se ha utilizado el for:


# ejemplo simple de for
for numero in $1
do
echo $numero
done
$ . script10 "uno dos tres"
uno
dos
tres
$

i) En el siguiente ejemplo se imprime los nombres de los subdirectorios del


directorio actual:
#Nombre: forstruct.sh
#Objetivo: imprime subdirectorios del directorio actual
for x in *
do
if [ -d $x ];
then
echo $x
fi
done

Mgter. Karim Guevara Puente de la Vega, Ing. Eveling Castro Gutierrez

Sesin 06

Laboratorio de Sistemas Operativos

Pgina: 9

j) Otro ejemplo en el que se muestra una forma alternativa del for:


# mas opciones de for
if [ $1 -lt $2 ]
then
numero=`expr $2 + 1`
for (( i=$1 ; i<$numero ; i++ ))
do
echo "$i es menor que $numero"
if [ $i = $2 ]
then
exit 0
fi
done
else
echo "opcion incorrecta !! la primera variable a de ser menor"
fi

Si ejecutamos el script:
$ ./prueba 44 45
44 es menor que 46
45 es menor que 46
$

Si la primera variable es mayor que la segunda, nos lanza el error y sale:


$ ./prueba 46 45
opcion incorrecta !! la primera variable a de ser menor
$

k) Un pequeo ejemplo que usa el ciclo while para desplegar nmeros del cero al
nueve:
x=0
while [ $x -lt 10 ]
do
echo $x
x=$((x+1))
done

l) En el siguiente ejemplo se lee una lista de nombres de archivos y ejecuta un


comando sobre cada uno de ellos:
#Nombre: whilestruct.sh
#Objetivo: visualiza un archivo dado
while read filename
do
cat $filename
done

m) El siguiente programa hacemos uso del until:


# imprimimos hasta 10 con until
cont=1
until [ $cont -gt 10 ] #hasta que $cont sea mayor que 10
do
echo $cont
cont=`expr $cont + 1`
done

Mgter. Karim Guevara Puente de la Vega, Ing. Eveling Castro Gutierrez

Sesin 06

Laboratorio de Sistemas Operativos

Pgina: 10

n) Se tienen tambin los comandos break, continue y exit, para indicarle al


shell que haga una determinada accin al encontrarlas en los ciclos. Por ejemplo:
# ejemplo con continue break y exit
if [ $# -ne 2 ] ; then
echo "necesito dos argumentos"
exit 1
fi
if [ $1 -gt $2 ] ; then
echo "$1 no puede ser mayor que $2"
exit 2
fi
for (( i=$1 ; i<$2 ; i++ ))
do
mod=`expr $i % 2`
if [ $mod -ne 0 ] ; then
continue # aqui prueba con break y exit
fi
echo " $i es par !!"
done

Para ejecutarlo:
$
4
6
8
$

./script13 4 9
es par !!
es par !!
es par !!

o) Las funciones tambin son uno recurso muy usado. Para entender mejor, veamos
el siguiente ejemplo:
# determina par e impar de los nmeros que introduzcamos dinmicamente
determinaPar() {
num=`expr $a % 2`
if [ $num -eq 1 ];then
echo "impar ; $a"
else
echo "par: $a"
fi
}
echo "Dame tres nmeros"
read a1
read a2
read a3
export a=$a1
determinaPar
export a=$a2
determinaPar
export a=$a3
determinaPar

Si lo ejecutamos:
$ . script12
Dame tres numeros
700
75
12346
par: 700
impar: 75
par: 12346
$

Mgter. Karim Guevara Puente de la Vega, Ing. Eveling Castro Gutierrez

Sesin 06

Laboratorio de Sistemas Operativos

Pgina: 11

V
EJERCICIOS
Los ejercicios de esta sesin los guardar en el directorio bin creado en la sesin anterior
01. Agregue la ruta del directorio bin a la ruta de bsqueda
02. Ejecute el siguiente Shell script el cual ingresa en el archivo logfile nombres con la
fecha y hora actual
#Nombre: names.sh
NOW=date + %Y%m%d%H%M%S
echo Ingresa nombres. Termina con Ctrl+d cuando finalices
while read line
do
echo $NOW: $line>>$HOME/logfile
done

03. Escriba un Shell script que muestre todos los nombres ingresados en el archivo
logfile con la fecha actual.
04. Ejecute el siguiente guion y describa su funcionamiento y resultados:
#Nombre: recent.sh
case $# in
0) ls lt | head ;;
1) case $1 in
[0-9]*) ls lt | head -$1;;
*)
echo Uso: nro de archivos recientes;;
esac;;
*) echo Uso: nro de archivos recientes;;
esac

Nota: este shell script es ejecutado con un parmetro, por ejemplo:


$. recent.sh 5
05. Ejecute el siguiente shell script y analice los resultados:
#Nombre: greeting.sh
hour=date +%H
if test $hour lt 12
then
echo Buenos dIas, $LOGNAME
else
if test $hour lt 17
then
echo Buenos tardes, $LOGNAME
else
echo Buenos noches, $LOGNAME
fi
fi

06. Escriba un Shell script en el cual se determine si un usuario dado est conectado o no
al sistema.
07. Modifique el guion anterior para determinar en cuntas terminales est conectado un
usuario determinado.
08. Suponga que a cualquier usuario excepto el root, slo se le permite acceder al
sistema mximo 3 veces, de lo contrario no se debe de permitir que se loguee las
Mgter. Karim Guevara Puente de la Vega, Ing. Eveling Castro Gutierrez

Sesin 06

Laboratorio de Sistemas Operativos

Pgina: 12

siguientes veces. Para cada una de las veces permitidas se le debe de dar la
bienvenida correspondiente de acuerdo a la hora de ingreso. (ver ejercicio 5).
09. Cierre el sistema.

VI
BIBLIOGRAFIA Y REFERENCIAS

Blanco, V., Linux Instalacin, Administracin y uso del Sistema, Ed. Ra-Ma,
Mxico, 2001.

http://users.exa.unicen.edu.ar/~hcurti/linux/index.html

Mgter. Karim Guevara Puente de la Vega, Ing. Eveling Castro Gutierrez

Sesin 06

También podría gustarte