Professional Documents
Culture Documents
2 Creacin de un script
Cmo crearemos un programa de scripting en GNU/Linux? Bien, para realizar
un programa interpretado no necesitamos grandes herramientas de diseo.
En GNU/Linux podemos usar herramientas de procesador de textos como
nano, vi o herramientas grficas como gedit.
En GNU/Linux no se requiere extensin en el nombre del fichero pero suele
utilizarse una extensin ms bien por reconocimiento a simple vista ms que
como imprescindible. La extensin que suele utilizarse es ".sh". Por ejemplo
"direccionar.sh".
Ejemplo de script:
Un ejemplo de script muy simple, que muestra por pantalla la fecha, el
intrprete de comando activo, el directorio HOME y visualiza el contenido del
directorio actual, todo ello secuencialmente, sera el siguiente:
date
echo $SHELL $HOME
ls
Tambin podemos copiar el script a una ruta especial que permita invocarlo
fcilmente. Por ejemplo, podemos copiarlo en /usr/sbin y ejecutarlo desde
cualquier parte sin incluir la ruta completa donde se encuentre:
# cp miscript.sh /usr/sbin/miscript
Opciones de depuracin:
#!/bin/sh
#Fichero: Ej01-param_1.sh
#Versin: 13/05/2006
#Ejemplo de utilizacin de parametros
posicionales
#Ejecucion de ejemplo: sh parametros.sh
uno dos tres
echo $#
echo $*
echo $0
echo $1
echo $2
echo $3
echo $4
#!/bin/sh
# Fichero: variables.sh
# Ejemplo de utilizacin de variables
# Ejecucion de ejemplo: sh variables.sh
nombre=Juan;apellidos="Lozano Rubio"
nombre_y_apellidos=$nombre" "$apellidos
echo $apellidos; echo $nombre_y_apellidos
#!/bin/sh
# Fichero: readvariables.sh
# Ejemplo de utilizacin de variables
# Ejecucion de ejemplo: sh readvariables.sh
echo Indique su nombre y sus dos apellidos
read nombre apellido1 apellido2
echo Hola $nombre $apellido1 $apellido2, Cmo estas?
Ejemplo:
#!/bin/sh
# Fichero: expresiones.sh
# Ejemplo de utilizacin de expresiones
# Se chequea que se pasen tres parmetros al script y en caso
# de que no sean tres, el programa finaliza su ejecucin.
# Ejecucin: sh expresiones.sh uno dos tres cuatro
if test $# -ne 3
then
echo Numero de parametros incorrectos
exit
fi
echo $1 $2 $3
Comparaciones numricas:
test
test
test
test
test
test
n1
n1
n1
n1
n1
n1
eq
ne
ge
gt
le
lt
n2
n2
n2
n2
n2
n2
Ejemplo:
cadena1=linux
cadena2=windows
if test -n cadena1 Si la longitud de la cadena es distinta de 0
if test cadena1 = cadena2 Si las cadenas cadena1 y cadena2 son iguales
test -f fichero -> Verdad si fichero existe y es un fichero regular (fichero normal, que no
es directorio, dispositivos, etc.).
test -s fichero -> Verdad si fichero existe y tiene un tamao mayor que cero.
test fichero1 -nt fichero2 -> Verdad si fichero1 es ms reciente (segn la fecha de
modificacin) que fichero2.
test fichero1 -ot fichero2 -> Verdad si fichero1 es ms antiguo que fichero2.
expr1 o expr2 -> OR verdad cuando al menos una de las condiciones sea
cierta.
expr1 a expr2 -> AND verdad cuando todas las condiciones sean ciertas.
! expresion -> NOT verdadero si expresion no es cierta.
La sentencia if
La sentencia case
El operador &&
El operador ||
3.1 Sentencia if
Su sintaxis posee tres posibles variaciones:
1 forma:
if condicion
then
Comandos a ejecutar
fi
2 forma:
if condicion
then
comandos si la condicin se cumple
else
comandos si la condicin no se cumple
fi
3 forma:
if condicion1
then
comandos si la condicin1 se cumple
elif condicion2
then
comandos si la condicin2 se cumple
else
comandos si las condiciones 1 y 2 no se cumplen
fi
Ejemplo:
#!/bin/sh
# Fichero: sentenciasconif.sh
# Ejemplo de ejecucin de script con sentencias if
# Ejecucin: sh sentenciasconif.sh
echo Introduce numero1
read n1
echo Introduce numero2
read n2
if test $n1 gt $n2
then
echo El numero $n1 es mayor que $n2
elif test $n2 gt $n1
then
echo El nmero $n2 es mayor que $n1
else
echo Los nmeros $n1 y $n2 son iguales
fi
Ejemplo:
#!/bin/sh
# Fichero: menu_case.sh
# Versin: 13/05/2006
# Ejemplo de utilizacin de la sentencia case
# Elimina recursivamente con confirmacin.
echo Este script borra recursivamente.
echo todos los ficheros a partir del directorio actual.
echo Desea realizar la operacin?
read option
case $option in
[Ss]*) rm r * ;;
[Nn]*) echo La operacin no se realizara;;
*) echo Respuesta incorrecta. La operacin no se realizar;;
esac
3.4 Operador ||
El operador || se utiliza para ejecutar un comando y en el caso de que falle ejecutar el
siguiente comando de la lista. El formato es el siguiente:
comando1 || comando2
Primero se ejecuta el comando1 y si se produce un error se ejecuta el comando2. La
estructura equivalente ser:
comando1
if test $? ne 0
then
comando2
fi
Ejemplo:
#!/bin/sh
# Ejemplo de utilizacin del operador ||
# El usuario enva un mensaje a otro usuario desde el terminal si
# est en el sistema y en caso contrario le enva un correo.
# Ejemplo: enviar_mensaje.sh pedro Tengo el documento. Llamame
echo $2 | (write $1 || mail S1 ;)
Ejemplo:
#!/bin/sh
Option=0
while [ $option ne 4 ]
do
echo Editores
echo 1.- vi
echo 2.- emacs
echo 3.- nano
echo 4.- Salir
echo
echo Selecciona una opcion ?
read option
case $option in
1) vi ;;
2) emacs ;;
3) nano ;;
4) echo Fin del programa exit ;;
*) echo Opcion incorrecta;;
esac
done
Ejemplo:
#!/bin/sh
#Fichero: sentencia_while.sh
# Ejemplo de utilizacin de la sentencia while
# Script que crea 5 ficheros cuyo nombre empieza por "curso" y
# luego un nmero que lo diferencia
num=1
while test $num le 5
do
touch curso$num
num=`expr $num + 1`
done
Ejemplo 1:
#!/bin/sh
# Fichero: sentencia_until.sh
# Ejemplo de utilizacin de la sentencia until. El script muestra
# los numeros del 1 al 10 por pantalla
contador=0
incremento=1
until
[ $contador eq 10 ]
do
echo $contador
contador=`expr $contador + $incremento`
done
Ejemplo:
#!/bin/sh
# Fichero: sentencia_until.sh
# Ejemplo de utilizacin de la sentencia until
# Script que crea 5 ficheros cuyo nombre empieza por "curso" y
# luego un nmero que lo diferencia
num=1
until test $num gt 5
do
touch curso$num
num=`expr $num + 1`
done
Ejemplo:
#!/bin/sh
# Fichero: sentencia_for_1.sh
# Ejemplo de utilizacin de la sentencia for
# Script que muestra los nmeros del 1 al 10 por pantalla,
# utilizando la sentencia for
lista= 0 1 2 3 4 5 6 7 8 9
for i in $lista
do
echo $i
done
5 Otros comandos
Modificando el hilo de ejecucin de los bucles
Existen dos sentencias que modifican el hilo de ejecucin dentro de los bucles, que son
las sentencias break y continue.
La sentencia break se utiliza para salir del bucle en el que se est introducido. Este
comando termina la ejecucin del bucle ms interno, provocando que la ejecucin
sea llevada hasta la sentencia done ms cercana. Si se desea salir de cinco niveles,
hay que utilizar el comando:
break num_niveles
Nota:
El comando eval que se usa en el siguiente ejemplo, interpreta la cadena de caracteres que se pone
como parmetro y a continuacin la ejecuta como un comando.
Ejemplo:
#!/bin/sh
# Fichero: sentencia_break_continue.sh
# Este ejemplo pide al usuario que introduzca un comando. Si el
# comando est vaco, no hace nada y pasa a pedir un nuevo
# comando. Si el comando es la palabra fin, entonces se sale del
# bucle y termina la ejecucin. En otro caso procesa el comando
while echo Introduce el comando:
read cmd
do
case $cmd in
fin)
)
*)
done
break;;
continue;;
eval $cmd;;
6 Funciones
El lenguaje de programacin de la Shell provee la facilidad para declarar funciones. Una
funcin es un segmento de cdigo reutilizable, que tiene un nombre, una lista de
parmetros y un conjunto de sentencias ejecutables. El formato general de una funcin
es el siguiente:
Nombre_funcion(){
sentencia1
sentenciaN
}
Los argumentos son pasados a la funcin de la misma forma que los parmetros
posicionales se pasan desde la lnea de comandos al script. Para llamar a una funcin
desde el cdigo basta poner su nombre, seguido por los parmetros posicionales que se
le pasan como argumentos.
No existe un mtodo formal para que una funcin devuelva un valor. No obstante, esto
se puede conseguir ejecutando la funcin encerrada entre comillas simples invertidas, y
visualizando el valor devuelto al final de la definicin de la funcin, tal como se hace en
el ejemplo anterior.
Adems, las funciones pueden ser recursivas, es decir, se pueden llamar a s mismas
dentro de las sentencias de la funcin.
Ejemplo 1:
#!/bin/sh
# Fichero: notas_medias.sh
# Ejemplo de utilizacin de funciones
# Consideremos la funcin calcula_media, que toma un nmero
# indeterminado de parmetros y calcula el valor medio de los
# mismos.
calcula_media (){
valor=0
for i in $@
do
valor=`expr $valor + $i`
done
echo `expr $valor / $#`
}
echo Las notas de Pedro son 4 4 5 5 5 7
echo y su nota media `calcula_media 4 4 5 5 5 7`
Ejemplo 2:
#!/bin/sh
# Fichero: prueba_factorial.sh
# Ejemplo de utilizacin de funciones recursivas
# Esta es una funcin recursiva que calcula el factorial de
# un nmero.
factorial(){
if [ $1 ge 1 ]
then
num1=`expr $1 1`;
num2=`factorial $num1`
echo `expr $num2 \* $1`
else
echo 1
fi
}
echo `factorial 4`