miércoles, 16 de abril de 2008

Escribiendo Shell Scripts

Linux es ademas de un Sistema Operativo un lenguaje de programacion, al igual que los lenguajes de bajo u alto nivel posee caracteristicas similares tales como variables locales y globales, como ademas posee interpretes con los cuales se puede realizar programas para este Sistema Operativo.

Entre los interpretes mas comunes esta el '/bin/bash', interprete bajo el cual se trata esta entrada.

Hagamos una pequena introduccion, empecemos escribiendo un archivo simple:
admin escribió:

#!/bin/bash
# Esto es un comentario
echo "Hola " $USER ", es un placer verlo por aqui!"
echo "Usted se encuentra en: " $PWD
echo "La fecha de hoy es: "`date +"%d/%m/%Y"`


Ahora almacenas esto en un archivo llamado 'ejemplo1.sh', entonces tendras un simple shell script. Puedes correrlo de las cuatro formas siguientes:

1)Usando el comando source:
admin escribió:

fred@test:~> source ejemplo1.sh
Hola fred, es un placer verlo por aqui!
Usted se encuentra en: /home/fred
La fecha de hoy es: 05/05/1994

2)Usando el punto como el comando source:
admin escribió:

fred@test:~> . ejemplo1.sh
Hola fred, es un placer verlo por aqui!
Usted se encuentra en: /home/fred
La fecha de hoy es: 05/05/1994

3)Usando el comando bash
admin escribió:

fred@test:~> bash ejemplo1.sh
Hola fred, es un placer verlo por aqui!
Usted se encuentra en: /home/fred
La fecha de hoy es: 05/05/1994

4)Haciendo ejecutable:
admin escribió:

fred@test:~> chmod a+x ejemplo1.sh
fred@test:~> ./ejemplo1.sh
Hola fred, es un placer verlo por aqui!
Usted se encuentra en: /home/fred
La fecha de hoy es: 05/05/1994

Continuando les anexo aqui otro ejemplo:
admin escribió:

#! /bin/bash
for i in 1 2 3 4 5
do
echo $i
done
--------
fred@test:~> chmod a+x ejemplo2.sh
fred@test:~> ./ejemplo2.sh
1
2
3
4
5

Aqui les doy otro ejemplo:
admin escribió:

#! /bin/bash
for i in *.html
do
grep -i \<title\> $i >> tittles.list
done
--------
fred@test:~> chmod a+x ejemplo3.sh
fred@test:~> ./ejemplo3.sh
<title>Yahoo! Telemundo</title>

Para hacer funciones:
admin escribió:

#!/bin/bash
function Imprimir(){
echo $1
}
Imprimir "Hola Mundo"
--------
fred@test:~> chmod a+x ejemplo4.sh
fred@test:~> ./ejemplo4.sh
Hola Mundo

Para leer datos de parte del usuario hay cuatro formas:

1) Usando read:
admin escribió:

#!/bin/bash
read -p "Ingrese un valor: " -e input
echo "Su valor es: '$input'"
--------
fred@test:~> ./ejemplo5.sh
Ingrese un valor: 6
6


2) Usando dialog:
admin escribió:

#!/bin/bash
dialog --inputbox \
"Escriba un valor: " 0 0 2> /tmp/inputbox.tmp.$$
retval=$?
input=`cat /tmp/inputbox.tmp.$$`
rm -f /tmp/inputbox.tmp.$$
case $retval in
0)
echo "Su valor es: '$input'";;
1)
echo "Cancelo la operacion.";;
esac
--------
fred@test:~> ./ejemplo6.sh
<--Aun no e hecho las imagenes-->


3) Usando Xdialog:
admin escribió:

#!/bin/bash
Xdialog --title "INPUT BOX" --inputbox \
"Escriba un valor: " 0 0 2> /tmp/inputbox.tmp.$$
retval=$?
input=`cat /tmp/inputbox.tmp.$$`
rm -f /tmp/inputbox.tmp.$$
case $retval in
0)
echo "Su valor es: '$input'";;
1)
echo "Cancelo la operacion.";;
255)
echo "Cerro la ventana.";;
esac
--------
fred@test:~> ./ejemplo7.sh
<--Aun no e hecho las imagenes-->


4) Usando zenity:
admin escribió:

#!/bin/bash
input=$(zenity --text "Escriba un valor: " --entry)
retval=$?
case $retval in
0)
echo "Su valor es: '$input'";;
1)
echo "Cancelo la operacion.";;
esac
--------
fred@test:~> ./ejemplo8.sh
<--Aun no e hecho las imagenes-->


Quizas zenity sea la mejor opcion cuando tienes funcionando una X, pero cuando no dialog es la mejor opcion o read como lo mas simple para un script.
Las paginas man ofrecen mayor documentacion.


Usando ciclos:
Con los ciclos podemos hacer maravillas, tanto moviendonos de un rango a otro como usandolos para movernos en el mismo sistema, empecemos con lo basico:
admin escribió:

#!/bin/bash
for (( i=1;i<=5;i++ ));do
echo $i
done
--------
fred@test:~> ./ejemplo9.sh
1
2
3
4
5
fred@test:~> _


Haciendo algo mas complejo, mostrando si es directorio o archivo los datos contenidos en una carpeta dada:
admin escribió:

#!/bin/bash
for item in `ls $1`;do
if [[ -d $item ]];then
echo $item": Es una carpeta"
else
echo $item": Es un archivo"
fi
done
--------
fred@test:~> ./ejemplo10.sh /home/test
avion.wmv: Es un archivo
Desktop: Es una carpeta
Documents: Es una carpeta
Pictures: Es una carpeta
video.avi: Es un archivo
fred@test:~> _