11 febr. 2009

Bash scripting básico y cuatro cosas mas

para crear un fichero de bash creas un fichero de texto plano, da igual el nombre, pero por costumbre se pone nombredelscript.sh y se le dan derechos de ejecución a este fichero, por ejemplo


chmod a+x script.sh
chmod sirve para cambiar los derechos de los ficheros, tienes para la primera parte u g o a, u para el usuario, g para el grupo, o para otros y a para all, después del símbolo + rwx, r para leer, w para escribir y x para ejecutar.

luego debes editar este fichero.

es importante iniciar el fichero de texto con la siguiente línea:

#!/bin/bash
con esto le indicamos que use el interprete de comandos bash, que es el propio de linux.

a continuación ponemos ahí nuestro código, el interprete nos va a permitir usar un gran numero de condiciones, while, switch, switch case, if, for, etc. cada una de las condiciones tiene también su sintaxis

condicional con un if
#!/bin/bash
if [ "foo" = "foo" ]; then
echo expression evaluated as true
fi
condicional con un if y un else
#!/bin/bash
if [ "foo" = "foo" ]; then
echo expression evaluated as true
else
echo expression evaluated as false
fi

condicional usando un if, un else y variables
#!/bin/bash
T1="foo"
T2="bar"
if [ "$T1" = "$T2" ]; then
echo expression evaluated as true
else
echo expression evaluated as false
fi
condicional usando un case (este es uno de mis favoritos!)
#!/bin/bash
T1=1
case ($T1) in
1)
echo 1
;;
2)
echo 2
;;
*)
echo otro
;;
esac
loop usando for
#!/bin/bash
for i in $( ls ); do
echo item: $i
done
loop usando while
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]; do
echo The counter is $COUNTER
let COUNTER=COUNTER+1
done
loop usando until
#!/bin/bash
COUNTER=20
until [ $COUNTER -lt 10 ]; do
echo COUNTER $COUNTER
let COUNTER-=1
done
además de los condicionales bash nos permite ejecutar los mismos comandos que podríamos ejecutar en una consola, por ejemplo si queremos crear un script que cuando lo ejecutamos nos muestre el contenido del directorio:
#!/bin/bash
ls
también podemos concatenar comandos usando &&
#!/bin/bash
cd /home && ls
cabe recordar que si falla uno de los comandos el siguiente no se ejecuta, el script anterior sería similar a hacer esto:
#!/bin/bash
cd /home
ls
también podemos hacer que el siguiente comando lea el output del anterior comando usando ||, similar a esto tenemos los pipes, que nos permiten ejecutar un programa sobre un comando, algunos de los mas usados son:

grep
ls -l |grep .avi
nos muestra todos las lineas del ls que contienen el string .avi
ls -l |more
nos muestra el output página a página
ls -l |tail
nos muestra las últimas 20 líneas del ls

ls -l |tail -80
nos muestra las últimas 80 líneas del ls

por otra parte, un programa que debemos tener muy en cuenta a la hora de crear scripts para administrar sistemas es rsync, que nos va a permitir sincronizar directorios en un momento, os recomiendo ver las distintas opciones que permite el programa, en el ejemplo vamos a realizar un mirror, vamos a usar una fuente remota con ficheros actualizados y la destinación local con los antiguos y vamos a realizar lo que se llama un mirror, una copia exacta de los ficheros

rsync -avu --delete ficherosremotos ficheroslocales
el --delete hace que se borren los ficheros que ya no existen en los ficheros locales, recomiendo checkear antes de poner en producción el comando la dirección de la transferencia de datos.

finalmente una vez creado nuestro script, lo vamos a ejecutar de la siguiente forma
laura@sofre:~$ ./script.sh
cuando creamos un script en términos de administración lo mas probable es que queramos ejecutarlo periódicamente, así que vamos a usar el cron para que se ejecute el script cuando lo deseamos.
laura@sofre:/etc$ ls |grep cron
anacrontab
cron.d
cron.daily
cron.hourly
cron.monthly
crontab
cron.weekly
cvs-cron.conf
nos fijamos que hay varios ficheros cron.algo, estos son scripts que ejecutan las tareas que hay en ellos, por otra parte está el crontab, que es el papá tareas, si lo editamos
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
si nos fijamos vemos que ya hay unas líneas que apuntan a los ficheros que comentábamos

la sintaxys de cron es muy simple

minuto hora diames numeromes diasemana usuario comando

1. Minutos: (0-59)
2. Horas: (0-23)
3. Días: (1-31)
4. Mes: (1-12)
5. Día de la semana: (0-6), siendo 1=Lunes, 2=Martes,... 6=sábado y 0=Domingo

Para especificar todos los valores posibles de una variable se utiliza un asterisco (*).

Por ejemplo vamos a ejecutar nuestro script cada media hora
*/2 * * * * root /root/script.sh
dónde ponemos el script también podemos ejecutar directamente un comando

ejecutamos el script cada día laborable a las 8 de la mañana
0 8 * * 1-5 root /root/script.sh
Pues hasta aquí cuatro cosas útiles para administrar scripts en un sistema :)

0 comentaris:

Publica un comentari a l'entrada