jueves, 1 de noviembre de 2012

Curso scripting bash rutinas y funciones


Esta ya es la penúltima parte de nuestros tutoriales de bash :(,pero en esta ocasión aprenderemos algo muy funcional ya que su mismo nombre lo dice funciones, también aprenderemos sobre las bibliotecas de rutinas ya que guardan algunos datos que los podemos consultar cada vez que queramos pero sin volver a escribir lo que seria la biblioteca de la rutina o función.

En distintos lenguajes de programación que he aprendido me han ayudado bastante las funciones y en bash no es la excepción.

Primero que nada la sintaxis de nuestra funcion en bash es asi

function nombre_de_la_funcion ()
{
bibliotaca de comandos
}

Algo de lo que se pueden haber dado cuenta es que no es lo mismo una rutina y una funcion,ya que en las rutinas esta es la sintaxis

nombre_de_la_rutina ()
{
bibliotaca de comandos
}


Cual es la diferencia,bueno vamos a darles un repaso y ustedes mismos lo veran

Funciones

Vamos a comenzar por lo básico pero aun así a estas alturas de los tutoriales ya debes saber que es un bucle y su sintaxis,bueno si no es así date una vuelta por los tutoriales pasados


Parte 1


Parte 2


Parte 3

Parte 4  

Parte 5 

Parte 6

Parte 7 


Parte 8

Bueno para nuestro ejemplo vamos a usar el bucle while y una funcion

1.Definimos una función

#!/bin/bash 

function ejemplo ()
{
echo Datos de hoy `date`
}

2.La llamamos

ejemplo

3.Listo ahora vemos el ejemplo

#!/bin/bash 

function ejemplo ()
{
echo Datos de hoy `date`
}
ejemplo

Lo ejecutamos

¿Que imprime en la terminal?

Este comando

echo Datos de hoy `date`

¿porque?

Quen sabe,no no es cierto lo imprime porque esta adentro de nuesta funcion de ejemplo y lo llamamos con

ejemplo

Como pueden darse cuenta para llamar la funcion no necesitamos asignale un valor,por ejemplo $

$ejemplo

Pero de hecho si lo ejecutamos así

#!/bin/bash 

function ejemplo ()
{
echo Datos de hoy `date`
}
$ejemplo

No da error, pero no imprime nada

¿Por que?

Porque la función no la toma en cuenta porque no es llamada y aunque $ejemplo valga algo,el valor es nulo (0) y tampoco se imprime en la pantalla y esto hace que se ejecute con un valor de 0

Ahora veamos el bucle while

#!/bin/bash

clear

vp=0

function ejemplo ()
{
echo "Numero principal"
}

while [ $vp -le 10 ]; do
        ejemplo
        echo "$vp"
        (( vp=$vp+1 )) 
        sleep 1;
done

clear

ejemplo

echo $vp


Ejecuten,vean lo que hace

Después vean la explicación

#!/bin/bash

clear # Limpiamos la consola

vp=0 # variable principal vale 0

function ejemplo () # Definimos funcion
{
echo "Numero principal" # En la biblioteca solo se encutra esto
}

while [ $vp -le 10 ]; do # Iniciamos bucle si la variable principal vale meno de 10
        ejemplo # Llamamos la funcion ejemplo
        echo "$vp" # llamamos la variable principal
        (( vp=$vp+1 )) # hacemos operacion aritmetica en la variable principal
        sleep 1; # esperamos 1 segundo y repetimos el bucle hasta que se rompa
done

clear

ejemplo # llamamos la funcion ejemplo de nuevo

echo $vp # llamamos la variable principal de nuevo


¿Y esto para que sirve?

Bueno puede que ya te hayas dado cuenta,sirve para no definir nuevamente una serie de comandos o comando al solo llamar la función con el nombre de la misma.

Por ejemplo lo anterior pero sin funciones seria asi

#!/bin/bash

clear

vp=1

while [[ $vp = 1 ]] ; do

          echo "Numero principal"
          echo $vp
          sleep 3;
          vp=2

done

echo "Numero principal"

echo $vp

¿Lo veo mas simple?

Es porque lo es,las funciones sirven si almacenan una biblioteca muy grande de ordenes y en este caso solo era el comando echo.

Vamos a ver algo útil.

Vamos a crear una funcion de error

Esta seria mas o menos así:

function error ()
{
 echo "Error inesperado"
 sleep 1;
 echo "Saliendo..."
 sleep 2;
 exit 1;
}

Bueno los comandos de la biblioteca de la funcion de arriba no hace falta explicarlos

Ahora vamos a añadirlos a un script,pero ahora vamos a usar la estructura selectiva if

Enlace




A lo que hace el código no le pongan mucha atención solo es un ejemplo que se me ocurrió ya que se puede usar lo que sea parte del shell scripting,lo importante aquí es que en la parte

if [ $pass = $passd ] ; then

echo "Bienvenido"

else

error # Aqui se llama
fi

Se llama la funcion de error que creamos

Y también en la parte

case $selection in

1)
ls
;;
2)
pwd
;;
3)
netstat
;;
*)
error # Aqui se llama otra vez
;;
esac

La llamamos y ejecuta lo mismo!!!

Pero sin definirla de nuevo, porque vean como seria este script sin usar funciones

#!/bin/bash

# Principal

#------------------

passd="password"

echo "Hola $LOGNAME"

echo "Escribe tu contraseña"

read pass

if [ $pass = $passd ] ; then

echo "Bienvenido"

else
echo "Error inesperado"
  sleep 1;
  echo "Saliendo..."
  sleep 2;
  exit 1;

fi

sleep 1;
clear

echo "Que decea hacer"

echo "1)Listar su contenido"

echo "2)Ver donde esta"

echo "3)Ver su estado se red"

read selection

case $selection in

1)
ls
;;
2)
pwd
;;
3)
netstat
;;
*)
echo "Error inesperado"
  sleep 1;
  echo "Saliendo..."
  sleep 2;
  exit 1;
;;
esac
#--------------
# Final

Rutinas

Bien una rutina es un poco diferente y de hecho no se si sea lo mismo y solo es que las personas lo llaman distinto,bueno veamos su sintaxis en un ejemplo y vamos a usarla diferente para ver un poco de diferencia

#!/bin/bash

fecha ()
{
echo "La fecha de hoy `date`"
}

vp=`fecha`

echo $vp

Como podemos ver en el ejemplo anterior le pasamos los comandos de una rutina a una variable, esta es una cualidad que tienes las rutinas,podemos definir su contenido y luego llamarlo definiendo su valor en una variable o tambien igual que una función

Ejemplo

#!/bin/bash

fecha ()
{
echo "La fecha de hoy `date`"
}

fecha

O como vimos antes,pasarle su valor a una variable y despues llamarla

#!/bin/bash

fecha ()
{
echo "La fecha de hoy `date`"
}

vp=`fecha`

echo $vp

Bueno, también existe un uso mas avanzado de rutinas que veremos a continuación pero primero,como definir variables en una rutina

Las variables que estén adentro de una rutina

rutina ()
{
Aqui
}

se consideran globales por lo cual serán vistas en todo el script pero tambien podemos definir variables locales con el comando typeset

Por ejemplo si no hacemos un script muy grande se puede leer de manera global como en este ejemplo:

#!/bin/bash

hola (){
 hola="Hola Mundo"
 echo $hola
}
hola="Hola"
hola
echo $hola

Pero si queremos definir una variable local,podemos hacer uso del comando typeset

Por ejemplo

#!/bin/bash

hola ()
{
typeset hola
hola="Hola Mundo"
echo $hola
}
hola

Ahora si vamos a ver el uso avanzado de esto,con el uso avanzado de variables en este caso:

$1..$3..$9 

Por ejemplo

#!/bin/bash
ejemplo ()
{
  typeset num
  (( num = $1 + $2 ))
  echo La suma es : $num
  return $num
}

ejemplo 10 10

Ejecuten y vean lo que hace

Aquí no voy a explicar porque es dificil(de explicar) solo pondré unos ejemplos para que vean como funcionan

Ejemplo 1

#!/bin/bash
ejemplo ()
{
 echo "Hola $1"
}
ejemplo $LOGNAME

Ejemplo 2

#!/bin/bash
hola ()
{
 echo $1
}  
hola "Hola Mundo" "ñ_ñ"
hola "Hola otra vez" ":D"
hola "Hola de nuevo" ":P"
hola "De nuevo" ":)"
hola "Ya me aburri" ":/"


Ejemplo 3

#!/bin/bash
hola ()
{
 echo $2
}  
hola "Hola Mundo" "ñ_ñ"
hola "Hola otra vez" ":D"
hola "Hola de nuevo :P"
hola "De nuevo ñ_ñ"
hola "Ya me aburri :/"

Ejemplo 3

#!/bin/bash
hola ()
{
 echo $1 $2
}  
hola "Hola Mundo" "ñ_ñ"
hola "Hola otra vez" ":D"
hola "Hola de nuevo" ":P"
hola "De nuevo" ":)"
hola "Ya me aburri" ":/"

Bueno eso es todo en este tutorial en el próximo tutorial(el ultimo) veremos GUI basica

No hay comentarios.:

Publicar un comentario

Los comentarios serán revisados antes de ser publicados.