Documentos de Académico
Documentos de Profesional
Documentos de Cultura
manual de Shells
Un pequeno
L. Fita
Grupo de Meteorologa, Universidad de Cantabria, Spain
version:2
Septiembre 2009
correspondencia: lluis.fita@unican.es
Resumen
Con las shells o scripts se consigue la automatizacion de qualquier comando o accion que se ejecute en linux. Esto permite crear sistemas
muy complejos de ejecucion que otorgan una gran potencialidad al sistema operativo linux. En estas notas se introducen los concetos basicos
para empezar a desarrollar shells.
1. Introduccion
Sin lugar a dudas, una de las potencialidades del Linux
es su lnea de comandos. Aunque para muchos usuari@s
entorno grafico-dependientes lo puedan encontrar una aberracion. Dado que la mayora de aplicaciones de linux se
pueden ejecutar desde la lnea de comandos, con los shells o
scripts podemos automatizar, sincronizar o relacionar dichas
aplicaciones. Para los usuari@s con mas antiguedad equivaldran a los antiguos archivos de lotes (los viejos .bat).
Hay muy pocas limitaciones en cuanto a uso de los shells
en linux. Su principal problema es el poco control de errores
que ofrece y la dificultad de interpretacion/busqueda de errores de scripts heredados. Al estar basada en comandos directos del sistema operativo, no precisa de la instalacion de
ningun software/paquete extra. Es un lenguaje bastante intuitivo y la dificultad suele recaer mas en saber que instruccion
del sistema operativo utilizar y el manejo de la misma. Esto
hace muchas veces que shells que hagan los mismo hay tantas como usuari@s de linux...
El linux ofrece varias shells distintas: ksh, csh,
tcsh, Bourne Shell, etc. que tienen pequenas diferencias de lenguaje. La mas primitiva es la Bourne Shell y de
las mas avanzadas la tcsh.
NOTAS:
1. Esta instruccion no seria necesaria de por s, ya que
se pueden ejecutar las scripts llamandolos directamente con la shell necesaria por ejemplo:
/bin/bash archivo.bash
2. La lnea de comandos ya tiene por defecto una shell,
que puede coincidir con el tipo de lenguaje utilizado
en la script. Para saber que shell se dispone por defecto se ejecuta el comando:
echo $SHELL
En lo que sigue, las escripts se describiran con la llamada
a la shell en su encabezamiento. Para hacer que una script
sea ejecutable le tendremos que dar permisos de ejecucion.
Para eso.
chmod +x archivo.bash
Los caracteres basicos en una script.
2. Comandos en bash
La primera instruccion que se pone en un Shell-script es
que shell queremos utilizar. Para utilizar la bash, en la
primera lnea se escribe: (por regla general, los archivos de
bash se les pone la extension .bash)
#!/bin/bash
# comentario
\ continuacion de instruccion a la siguiente lnea
; poner dos instrucciones en la misma lnea
| captura de salida de la instruccion anterior para la siguiente (pipe)
> captura de la salida de un comando a un fichero de
salida (normalmente)
>> captura de la salida de un comando a un fichero de
salida (normalmente) a partir de la u ltima lnea
& ejecucion de un comando liberando el terminal (sin
esperar su finalizacion, en modo background)
$() captura el valor de la instruccion que este entre
parentesis
Manual de Shell
As por ejemplo:
#/bin/bash
pi=3.141593
echo "pi= "${pi}" el numero"
pi= 3.141593 el numero
condicionales:
if: Con ella se hacen las estructuras condicionales
mas simples. Su estructura es del tipo:
if test [condicion]
then
(...)
else
(...)
fi
El analisi de la condicion se hace por medio de distintas opciones, algunas de las cuales se detallan:
-a El archivo existe
-d El archivo existe y es un directorio
= Los strings son iguales
-eq, -ne, -lt, -le, -gt, -ge comparaciones aritmeticas estandares
Al escribir if test ! [condici
on] la
condicion pasa a ser falsa. Un ejemplo con la instruccion.
#!/bin/bash
num1=1
num2=3
if test $num1 -gt $num2
then
echo "El numero 1 es mas \
grande que el 2"
echo "num1 > num2 -->"${num1}\
" > "${num2}
else
echo "El numero 1 es mas \
pequeno que el 2"
echo "num1 < num2 -->"${num1}\
" < "${num2}
fi
El numero 1 es mas pequeno que el 2
num1 < num2 >1 < 3
case: Con ella se hacen estructuras de multiples
opciones. Su estructura es del tipo
case [variable] in
[opci\on 1])
;;
[opci\on 2])
;;
(...)
[opci\on n])
;;
*)
[todos los otros valores]
esac
Manual de Shell
3)
rom=iii
palabra=romanos
;;
4)
rom=iv
palabra=romanos
;;
5)
rom=v
palabra=romanos
esac
echo "Tenemos "${num}" "${palabra}\
": "${rom}
done
./romanos.bash
Tenemos 3 romanos: iii
Tenemos 4 romanos: iv
Tenemos 1 romano: i
Tenemos 2 romanos: ii
read: Con esta instruccion se interactua con el usuario
esperando la entrada en el terminal. En el ejemplo anterior se anade (quitando el bucle):
#!/bin/bash
echo "Quantos romanos tenemos?"
read num
case $num in
1)
(....)
esac
echo "Tenemos "${num}${palabra}\
": "${rom}
Por ejemplo:
./romanos.bash
Cuantos romanos tenemos?
3
Tenemos 3 romanos: iii
exit: Con esta instruccion paramos la ejecucion de una
script. Si en el ejemplo anterior se anade una condicion
mas en el case
(...)
6)
echo "Hay demasiados romanos!"
exit
;;
(...)
Nos dara:
./romanos.bash
Cuantos romanos tenemos?
6
Hay demasiados romanos!
sleep: Con esta instruccion paramos una script un determinado numero de segundos [n]. Su semantica:
sleep [n]
2.1.1 Funciones
2.2 Argumentos
Las scripts de Shell tienen la capacidad de poder trabajar
hasta con 9 argumentos cuando se las llama des de la lnea
de comandos. Dentro de la script se las llama como $1, $2,
..., $9. Se considera argumento a cada palabra (conjunto
de caracteres separados por un espacio) que sigue a la script.
Dentro de la script tenemos otras variables relacionadas con
$, tales como:
$0 Nombre de la script ejecutandose
$* Argumentos mandados a la script
$# Numero de argumentos pasados a la script
Asi por ejemplo retocando el codigo de la script anterior.
#!/bin/bash
echo "Script: "$0
echo "Argumentos: "$*
echo "Numero de argumentos: "$#
num=$1
palabra=$2
case $num in
1)
rom=i
;;
2)
rom=ii
palabra=${palabra}s
;;
3)
rom=iii
palabra=${palabra}s
;;
4)
Manual de Shell
rom=iv
palabra=${palabra}s
;;
5)
rom=v
palabra=${palabra}s
;;
6)
palabra=${palabra}s
echo "Hay demasiados "${palabra}
exit
esac
echo "Tenemos "${num}" "${palabra}\
": "${rom}
Nos da:
./romanos.bash 4 galo
Script: ./romanos.bash
Argumentos: 4 galo
Numero de argumentos: 2
Tenemos 4 galos: iv
Hay otras variables estandard de linux que se pueden llamar des de una script. Unas cuantas son (para bash):
con instrucciones
3. Interaccion
linux
Las scripts pueden interactuar con qualquier comando de
linux. Algunos ejemplos muy senzillos se detallan a continuacion. Se recomienda mirar la aydua en lnea (man
instruicci
on) de estas y de muchas mas instrucciones
que estan en la lnea de comandos. Las salidas de las insrtucciones se pueden tratar de distintas maneras, algunas de
ellas:
comando: Salida en pantalla de los resultados
comando > archivo: Se captura la salida del comando en un fichero
comando >> archivo: Se captura la salida del comando en un fichero volcando su contenido despues de
la u ltima lnea
variable=comando: Se almacena la salida del
comando en la variable
expr: Con este comando se hacen operaciones entre
variables. Es de las maneras mas senzillas de hacer operaciones. Las operaciones numericas se hacen solo con
numeros enteros. Es una instruccion sencilla, pero muy
completa. Entre sus funciones estan
expr [num1] [+-*/%] [num2]: Sumar, restar, mul-
Escrivir un fichero des de una script. La etiqueta EOF indica hasta donde esta el contenido del
fichero.
(
cat << EOF
(...)
EOF
) > fichero
wc: Contador de lneas, palabras y caracteres
tail: Nos da las [n] lneas u ltimas de un fichero
head: Nos da las [n] lneas primeras de un fichero
Un ejemplo un poco semnzillo con algunas de
las interacciones se muestra a continuacion (llamado
instrucciones.bash):
#!/bin/bash
if test $1 = -h
then
echo "*****************************"
echo "***
Shell para dar los ***"
echo "***
los ficheros que
***"
echo "*** cumplan una condicion ***"
Manual de Shell
3.1 AWK
Con este programa se gana un entorno similar al C para
trabajar con contenidos de ficheros o con salidas de intrucciones. Ademas permite la creacion de funciones las cuales
podemos llamar dentro de una script. Tiene una semantica
propia distinta a la de Shell. Opera con numeros reales, funciones matematicas, formatos de salids, etc. Es muy completo y extenso, se dan tres ejemplos muy senzillos:
Documento Grupo de Meteorologa, Santander (CSIC-UC): D-GMS:2009.1;17
Manual de Shell
Anexo
A. Manuales
Basico: ttp://www.gnu.org/software/bash/manual/bashref.html
Wiki:
Principiantes
http://es.wikibooks.org/wiki/El_Manual_de_BASH_Scripting_Bsico_para_
Avanzado: http://tldp.org/LDP/abs/html/
AWK: http://www.vectorsite.net/tsawk.html
B. sinus hoy.bash
#!/bin/bash
if test $1 = -h
then
echo "***************************"
echo "*** Shell para dinujar ***"
echo "*** una curva sinusoide ***"
echo "***
en funcion del
***"
echo "*** segundo y el minuto ***"
echo "***************************"
echo "sinus_hoy.bash N(numero de frames) SALT(salto entre frames [seg])"
else
istep=1
while test $istep -le $1
do
## La hora, minuto y segundo de hoy
## en formato [hh], [mm] y [ss]
Hhoy=date +%H
Mhoy=date +%M
Shoy=date +%S
## Generacion de un archivo GNUplot
(
cat << EOF
set terminal png
set output sinus_hoy_@HH@@MM@@SS@.png
A=@HH@/24.
B=@MM@/30.
C=@SS@/30.
set xrange[-3*pi:3*pi]
set label sprintf("A= %.3g", A) at graph 0.1, 0.9
set label sprintf("B= %.3g", B) at graph 0.1, 0.85
set label sprintf("C= %.3g", C) at graph 0.1, 0.8
plot A*sin(B*pi+C*x) t "Asinus(Bpi+C*x)" w l lt 1 lw 3
EOF
) > sinus_hoy.gnu
## Substitucion de las variables
## por sus valores
sed -e s/@HH@/${Hhoy}/g sinus_hoy.gnu > stepA.inf
sed -e s/@MM@/${Mhoy}/g stepA.inf > stepB.inf
sed -e s/@SS@/${Shoy}/g stepB.inf > sinus_hoy_${Hhoy}${Mhoy}${Shoy}.gnu
## Dibujo de la grafica
##
gnuplot sinus_hoy_${Hhoy}${Mhoy}${Shoy}.gnu
Manual de Shell
## Visualizacion
##
display sinus_hoy_${Hhoy}${Mhoy}${Shoy}.png &
## Se dejan pasar $2 segundos
sleep $2
## Se elimina la visualizacion
killall display
istep=expr $istep + 1
### Fin del bucle
done
## Vaciado del directorio
sleep $2
rm *.png
rm *.gnu
fi