Menú principal
Inicio
Artículos
Noticias
Histórico de la Lista
Linux IDES
Linux Week
Descargas
Video Tutoriales
Opinión Software Libre
Preguntas frecuentes
Eventos Próximos
Talleres de Linux y LaptopFest
Encuesta
¿Que sección del portal Tuxpuc te agrada más?
 
Galería TuxPuc
Últimas noticias
Sindicación
 


Este portal se ve mejor con Firefox

Firefox

Programación en Bash
escrito por Henry Carrion & Kenneth Lopez   
Friday, 01 de September de 2006
 1. Requisitos

Si estas familiarizado con las líneas de comandos de GNU/Linux así como también con los conceptos básicos de programación, estas serán herramientas básicas de mucha ayuda.

2. Scripts Básicos

Este documento intenta mostrar el panorama de la programación en shell basado en ejemplos aplicativos asimismo algunos scripts que ayudaran a desarrollar técnicas acerca de este tema.

2.1 El famoso Hola Mundo
Para poder correr el programa de una manera sencilla por medio de la consola es abriendo un editor en el cual colocaremos todo nuestro script.

vi prueba1
#!/bin/bash
echo Hola Mundo

En la primera línea del script indica la dirección donde el programa es usado para correr el archivo
La segunda línea es la única acción de este script, el cual imprime “Hola Mundo” en la consola.
Grabamos dicho archivo modificado y cambiamos los permisos:

chmod 777 prueba1
Por ultimo ejecutamos este ejemplo:
./prueba1
El cual te mostrara:
Hola Mundo

3. Redirecciones

3.1 Teoría

ENTRADA/SALIDA ESTÁNDAR Y LOS DESCRIPTORES DE ARCHIVO

La entrada y salida estándar es la capacidad del intérprete de comandos o shell para controlar y dirigir la entrada de datos de los programas, la salida de información útil y la información de errores. Cuando un programa se ejecuta, automáticamente se le proporcionan tres descriptores de
archivo:

ETRADA ESTÁNDAR (STDIN) o DESCRIPTOR DE ARCHIVO 0

El descriptor de archivo STDIN está asociado a la entrada de texto. Por defecto está asociado al teclado.

SALIDA ESTÁNDAR (STDOUT) o DESCRIPTOR DE ARCHIVO 1

El descriptor de archivo STDOUT se corresponde con la salida de texto normal de los programas. Por defecto está asociado al erminal de pantalla.

EROR ESTÁNDAR (STDERR) o DESCRIPTOR DE ARCHIVO 2

El descriptor de archivo STDERR también es una salida de texto, ero se usa exclusivamente para mostrar los errores generados or los programas. Por defecto también está asociado al terminal de pantalla.

El descriptor stdout de los programas está asociado por efecto a la pantalla del terminal. Pero de la misma manera ue es posible redireccionar la salida de un comando a la entrada de otro, también es posible redireccionar cualquiera de los tres descriptores a un archivo. Operador descripción

cmd < file

El contenido de file se utilizará como entrada de la orden cmd

cmd 1> file1
cmd > file1

La salida estándar de la orden cmd se guardará en file. Si el archivo file existe se sobrescribirá.

cmd 1>> file1
cmd >> file1

L salida estándar de la orden cmd se guardará enfile. La información se escribirá al final del archivo.

cmd 2> file2

Los errores de la orden cmd se guardarán en file. Si el archivo file existe se sobrescribirá.

cmd 2>> file2

Los errores de la orden cmd se guardarán en file. La información se escribirá al final del archivo.


cmd > file 2>&1

La salida estándar y la de errores de la orden cmd se guardarán en file. Si el archivo file existe se sobrescribirá.


cmd >> file 2>&1

La salida estándar y la de errores de la orden cmd se uardarán en file. La información se escribirá al final del archivo.


cmd1 | cmd2

Redirecciona la salida del comando cmd1 hacia la entrada del comando cmd2.

4. Pipes

Ahora explicaremos, de manera muy simple como usar los pipes y porque querrán usarlos.

4.1 ¿Qué cosa son los Pipes y porque usarlos?

Usar los pipes les permitirá de manera muy fácil usar la salida de un programa para que esta sea la entrada para otro programa.


4.2 Ejemplo: Un pipe simple con ‘sed’

Primero un simple ls –l del directorio /boot
ls -l | sed -e "s/[aeio]/u/g"

Ahora explicaremos lo que pasa, el comando ls –l es ejecutado,  la salida de este comando en vez de ser impresa en pantalla como es lo usual, es enviada (“piped”) al programa sed, el cual imprime lo que debe.


4.3 Ejemplo: Un ls –l alternativo a *.txt

Probablemente, este es uno de los modos mas difíciles de hacer un ls –l *.txt, pero esto sirve bastante para ilustrar los pipes, obviamente no para estar realizando listados.


ls -l | grep "\.txt$"

Aquí, la salida del ls –l, será enviada al grep, el cual imprimirá las líneas que concuerden el regex "\.txt$".


4.4 Otras detalles de los Pipes

# cat mifichero | grep gato

Lo que este comando hará será lo siguiente: La primera parte antes de la barra vertical, conseguirá el contenido del fichero mifichero, y con la barra vertical, en lugar de sacarlo por la pantalla, lo enviará a la entrada estándar (stdin) de tal forma que el programa grep leerá desde stdin el contenido del fichero mifichero. El concepto del efecto que esto produce es fácil de entender: el comando que va detrás de la barra lee de la salida que dió el comando anterior. Es obvio que lo que obtendremos serán las líneas del fichero ifichero que contienen la palabra "gato" por la pantalla

(stdout).
# grep gato < mifichero

Esta línea es equivalente a la del ejemplo anterior. El contenido del fichero que ponemos a la derecha del signo se va a la entrada estándar de la que lee el comando que ponemos a su izquierda, por lo tanto esta línea conseguiría exactamente el mismo efecto que la del ejemplo anterior.


# echo "Esta es otra línea" >> texto

Vemos en qué es similar a lo anterior; la línea "Esta es otra línea se ha escrito al fichero texto. Si el fichero no existía, ha sido creado, y la diferencia, si existía y tenía contenido, la línea se ha escrito al final del fichero, debajo del contenido que ya tenía. Este comportamiento nos puede ser muy útil de cara a ir añadiendo líneas a un archivo sin necesidad de tener que abrirlo con un editor.


5. Variables

El uso de variables es casi el mismo que en cualquier leguaje de programación. No hay tipos de datos, en bash una variable puede contener un número, un carácter, una cadena de caracteres. Tampoco se necesita declarar la variable, solo asignarle el valor será más que suficiente para que se cree.


5.1 Ejemplo: El clásico Hola Mundo usando variables

Línea 1 #!/bin/bash
Línea 2 STR="Hello World!"
Línea 3 echo $STR

La línea 2 crea la variable llamada STR y le asigna la cadena de caracteres “Hello Worl”. Luego el valor de esta variable es mandado usando el signo ‘$’ al inicio de la variable, usenlo y prueben si quieren sin el signo y verán que el resultado es diferente.


5.2 Ejemplo: Un scritp simple de backup

Línea 1 #!/bin/bash
Línea 2 OF=/var/my-backup-$(date +%Y%m%d).tgz
Línea 3 tar -cZf $OF /home/me/

Este script es un buen ejemplo, lo que hace es un backup de una carpeta, la comprime y la guarda en un lugar especifico. Primero que nada, la variable de asignación de la Línea 2. Nótese que este script, al momento de ejecutarse la fecha cambiara no será la misma, debido al formato de date command(+%Y%m%d). En esta parte del script podra colocar cualquier formato que uno quiera.


Otros ejemplos:

echo ls
echo $(ls)

5.3 Variables Locales

Las variables locales pueden ser creadas con la palabra "local”

#!/bin/bash
HELLO=Hello
function hello {
local HELLO=World
echo $HELLO
}
echo $HELLO
hello
echo $HELLO

Con este ejemplo simple se puede ver como se usan las variables locales.

6. Condicionales

Las condicionales permite decidir el realizar una acción o no, esta decisión se toma evaluando un expresión dada.


6.1 Teoría

Las condicionales tienen muchas formas. La clásica y la mas básica es if expresión then instrucción, donde instrucción es ejecutada solo si la expresión es verda. Las condicionales tienen otras formas como if exprecion1 then instruccion1 else instruccion2. Aca solo se ejecuta la instruccion1 si la expresión1 es verdad sino sera ejecutada la instruccion2.

 

Básicamente las mismas estructuras usadas en cualquier otro lenguaje de programación son usadas aca también. La construcción básica del if en bash seria:


if [expresión];
then
code if 'expresión' is true.
fi

6.2 Ejemplo: Ejemplo básico de condicional if .. then ... else

#!/bin/bash if [ "algo" = "algo" ]; then
echo expresión evaluada como verdadera
else
echo expresión evaluada como falsa
fi

6.3 Ejemplo: Condicionales con variables

#!/bin/bash
T1="algo"
T2="algos"
if [ "$T1" = "$T2" ]; then
echo expresión evaluada como verdadera
else
echo expresión evaluada como falsa
fi

6.4 Ejemplo: comprobando si existe un fichero

#!/bin/bash
FILE=~/.basrc
if [ -f $FILE ]; then
echo el fichero $FILE existe
else
echo fichero no encontrado
fi
if [ 'test -f $FILE']
fi

7. Los bucles for, while y until

En esta sección se encontrará con los bucles for, while y until. La mayoría de ellos son muy parecidos al modo de usar que en cualquier otro lenguaje de programación. El bucle for es distinto a los de otros lenguajes de programación. Básicamente, le permite iterar sobre una serie de `palabras' contenidas dentro de una cadena.

El bucle while ejecuta un trozo de código si la expresión de control es verdadera, y sólo se para cuando es falsa (o se encuentra una interrupción explícita dentro del código en ejecución). El bucle until es casi idéntico al bucle loop, excepto en que el código se ejecuta mientras la expresión de control se evalúe como falsa.


Si sospecha que while y until son demasiado parecidos, está en lo cierto.

7.1 Por ejemplo

Línea 1 #!/bin/bash
Línea 2 for i in $( ls ); do
Línea 3 echo item: $i
Línea 4 done

En la segunda línea declaramos i como la variable que recibirá los diferentes valores contenidos en $( ls ).  La tercera línea podría ser más larga o podría haber más líneas antes del done (4).`done' (4) indica que el código que ha utilizado el valor de $i ha acabado e $i puede tomar el nuevo valor.

 

Este script no tiene mucho sentido, pero una manera más útil de usar el bucle for sería hacer que concordasen sólo ciertos ficheros en el ejemplo anterior.


7.2 for tipo-C

Es un bucle for más parecido al for de C/perl...

#!/bin/bash
for i in `seq 1 10`;
do
echo $i
done

7.3 Ejemplo de while

#!/bin/bash
CONTADOR=0
while [ $CONTADOR -lt 10 ]; do
echo El contador es $CONTADOR
let CONTADOR=CONTADOR+1
done

Este script 'emula' la conocida (C, Pascal, perl, etc) estructura `for'.

7.4 Ejemplo de until

#!/bin/bash
CONTADOR=20
until [ $CONTADOR -lt 10 ]; do
echo CONTADOR $CONTADOR
let CONTADOR-=1
done

8. Funciones

Como en casi todo lenguaje de programación, puede utilizar funciones para agrupar trozos de código de una manera más lógica, o practicar el divino arte de la recursión. Declarar una función es sólo cuestión de escribir function mi_func { mi_código }. Llamar a la función es como llamar a otro programa, sólo hay que escribir su nombre.


8.1 Ejemplo de funciones

Línea 1 #!/bin/bash
Línea 2 function salir {
Línea 3 exit
Línea 4 }
Línea 5 function hola {
Línea 6 echo ¡Hola!
Línea 7 }
Línea 8 hola
Línea 9 salir
Línea 10 echo algo

Las líneas 2-4 contienen la función 'salir'. Las líneas 5-7 contienen la función 'hola'. Hay que tener en cuenta que una función no necesita que sea declarada en un orden específico. Cuando ejecute el script se dará cuenta de que: primero se llama a la función 'hola', luego a la función 'quit', y el

programa nunca llega a la línea 10.

9. Interfaces de usuario

9.1 Utilizando select para hacer menús sencillos

#!/bin/bash
OPCIONES="Hola Salir"
select opt in $OPCIONES; do
if [ "$opt" = "Salir" ]; then
echo done
exit
elif [ "$opt" = "Hola" ]; then
echo Hola Mundo
else
clear
echo opción errónea
fi
done

Si ejecuta este script verá que es el sueño de un programador para hacer menús basados en texto. Probablemente se dará cuenta de que es muy similar a la construcción 'for', sólo que en vez de iterar para cada 'palabra' en $OPCIONES, se lo pide al usuario. Imagínense que ahora en vez de que haga un simple echo ahora ejecute un subprograma u otro script según sea la opción escogida, la utilidad de esto es muy grande.


10. Miscelánea

10.1 Leyendo información del usuario

En muchas ocasiones, puede querer solicitar al usuario alguna información, y existen varias maneras para hacer esto. Ésta es una de ellas:


#!/bin/bash
echo Por favor, introduzca su nombre
read NOMBRE
echo "¡Hola $NOMBRE!"

Como variante, se pueden obtener múltiples valores con read. Este ejemplo debería clarificarlo.

#!/bin/bash
echo Por favor, introduzca su nombre y primer apellido
read NO AP
echo "¡Hola $AP, $NO!"

10.2 Evaluación aritmética

Pruebe esto en la línea de comandos (o en una shell):
echo 1 + 1
Si esperaba ver '2', quedará desilusionado.

¿Qué hacer si quiere que BASH evalúe unos números?
La solución es ésta: echo $((1+1))

Esto producirá una salida más 'lógica'. Esto se hace para evaluar una expresión aritmética. También puede hacerlo de esta manera:


echo $[1+1]

Si necesita usar fracciones, u otras matemáticas, puede utilizar bc para evaluar expresiones aritméticas.

Si ejecuta "echo $[3/4]" en la línea de comandos, devolverá 0, porque bash sólo utiliza enteros en sus respuestas. Si ejecuta "echo 3/4|bc -l", devolverá 0.75.

ALGUNOS EJEMLOS VARIADOS DE BASH

􀀹 Re-nombrador de ficheros (sencillo)

#!/bin/bash
# renombra.sh
# renombrador de ficheros básico
criterio=$1
expresion=$2
sustituto=$3
for i in $( ls *$criterio* );
do
orig=$i
dest=$(echo $i | sed -e "s/$expresion/$sustituto/")
mv $orig $dest
done

􀀹 Un script de copia de seguridad muy simple (algo mejor)

#!/bin/bash
ORIG="/home/"
DEST="/var/copias_de_seguridad/"
FICH=home-$(date +%Y%m%d).tgz
tar -cZf $DEST$FICH $ORIG
􀀹 Un script sencillo
#!/bin/bash
echo ""
echo " EJEMPLO DE INGRESO DE DATOS"
echo -n "Pon el dia de tu nacimiento: "
read dia
echo -n "Pon el mes de tu nacimiento: "
read mes
echo -n "Pon el Año de tu nacimiento:"
read numero
echo "La Fecha de tu nacimiento"
echo "El dia: $dia"
echo "El mes : $mes"
echo "El Año : $numero"
echo ""
echo "La fecha completa es:"
echo "El dia $dia en el mes de $mes del año $numero "

􀀹 Suma de Datos

#!/bin/bash
echo ""
echo " EJEMPLO DE SUMA DE DATOS"
echo " Suma de 2 valores "
echo -n "Pon el primer valor a sumar: "
read numero1
echo -n "Pon el segundo valor a sumar: "
read numero2
numero3=$[numero1+numero2]
echo ""
echo "Los dos numeros a sumar seran $numero1 mas el
$numero2"
echo "El total es = $numero3 "

􀀹 Ejemplo De Condicion Para Comparar Si Un Numero Es Igual
40"

echo ""
echo " EJEMPLO DE CONDICION PARA COMPARAR SI UN NUMERO
ES IGUAL 40"
echo ""
echo -n " Ingresa un valor para compararlo con 40 = "
read valor
if [ $valor = 40 ]
then
echo ""
echo " El valor que ingresaste es igual 40 "
echo ""
else
echo ""
echo " El valor que ingresaste es no es igual a 40"
echo ""
fi

Autores:
Henry Carrion
Martin Kenneth Lopez

Referencias

o http://www.wikilearning.com/scripts_basicos_para_bash_i-wkccp-9574-20.htm
o http://www.ubuntu-es.org/node/20639
o http://es.tldp.org/Manuales-LuCAS/AA_Linux_colegio-1.1/AA_Linux_colegio-1.1-html/x3772.htm
o http://www.zonasiete.org/manual/ch07.html
o http://www.insflug.org/COMOs/Bash-Prog-Intro-COMO/Bash-Prog-Intro-COMO-2.html
o http://www.insflug.org/COMOs/Bash-Prog-Intro-COMO/Bash-Prog-Intro-COMO.html

 
< Anterior   Siguiente >