Cómo usar funciones en Bash

Cómo usar funciones en Bash mediante este lenguaje informático basado en la shell de Unix y compatible con POSIX. Como lenguaje su función consiste en la interpretación de los comandos de Linux, permitiendo automatizar nuestros procesos repetitivos y también crear comandos a partir de la órdenes del sistema operativo. En este artículo repasaremos cómo usar las funciones en Bash. Recomiendo leer el artículo cómo crear tus propios scripts usando Bash.

En el scritp que proponemos usamos el lenguaje Bash para busar un archivo a partir conociendo su nombre. Para ello usaremos el comando find pero ayudándonos de las funciones previamente definidas en dicho script. Hay que tener en cuenta una peculiaridad o limitación de Bash que no está presente en todos los lenguajes: para llamar a una función ésta ha de estar definida previamente.

Definir funciones

Existen dos formas de definir las funciones: con o sin la declaración function:

function nombre_funcion () 
{
    # codigo
}

o bien esta otra, que es la que yo uso como verás más adelante.

nombre_funcion ()
{
    # codigo
}

Asimismo Bash también provee un método para pasar parámetros y devolver resultados que veremos en próximos artículos.

#!/usr/bin/env bash

# ~/.bin/encontrar
# encuentra archivos a partir de la descripción de su nombre en un directorio específico
#
# Por Pedro Ruiz Hidalgo
# version 1.0.0
# Copyright © enero 2017
#
#

EXIT_OK=0
EXIT_BAD=66

PATRON=$1
DIRECTORIO=$2

autor ()
{
 echo -e "\nPedro Ruiz Hidalgo @petrorum. Copyright © 2017\n"
}

ayuda ()
{
 echo -e "\nencontrar [PATRON] [DIRECTORIO]\n"
} 

noparams ()
{
 echo -e "\nSon necesarios dos parámetros\nencontrar -h para ayuda\n"
 read -p "¿Quieres ver la ayuda? (S|s)" -n 1 -r
 if [[ $REPLY =~ ^[Ss]$ ]];
    then
       echo ""
       ayuda
 fi
}

nodir ()
{
 echo -e "\nDirectorio no Existe\n"
}

if [[ $PATRON == "-h" ]];
then 
 ayuda
 exit $EXIT_OK
fi

if [[ $PATRON == "-a" ]];
then 
 autor
 exit $EXIT_OK
fi

if [ $# -lt 2 ];
then
 noparams
else
 if [ -d $DIRECTORIO ];
 then
 echo ""
 find $DIRECTORIO -name $PATRON*
 echo ""
 exit $?
 else 
 nodir 
 exit EXIT_BAD
 fi
fi


Análisis del script

Definiciones

Para Bash todo proceso terminado con éxito debe tener el código «0» como señal. En las lineas 12 y 13 se definen los códigos de error manejados EXIT_OK para éxito y EXIT_BAD para salida en caso de fallo.

En las lineas 15 y 16 se asignan a las variables PATRON y DIRECTORIO los parámetros primero ($1) y segundo ($2) que aparecen en la linea de comandos tras el nombre del script como veremos más adelante cuando lo ejecutemos.

En la línea 18 creamos nuestra primera función. La función llamada «autor» muestra por consola la autoría del script cuando lo llamemos con el argumento «-a» como se puede ver en el if en las lineas 50~54. El argumento «-e» de la línea 23 permite mostrar la secuencia de «siguiente linea» mediante la codificiación «\n».

La llamada a noparams (lineas 28~37) se encarga de gestionar los sucesos que deben ocurrir cuando el script es llamado sin ningún parámetro. Mostramos debidamente encerrado entre códigos de nueva linea, un mensaje indicando que el script debe ser ejecutado con dos parámetros, seguidamente se muestra una opción (linea 31) para mediante read que insta a pulsar «S» o «s» en caso de querer mostrar la ayuda. En la linea 32 decimos literalmente: ‘si la respuesta (que nos llega en la variable $REPLY) contiene cualquiera de los caracteres ese mayúscula o minúscula’, entonces (linea 33) muestra una linea vacía (linea 34) y ejecuta la función ayuda (lineas 23~26).

La función nodir (lineas 39~42) será ejecutada cuando detectemos que el directorio donde se intenta realizar la búsqueda no exista.

Funcionalidad

Con esto ya tenemos definidas todas las funciones necesarias para ejecutar nuestro programa, que realmente empieza en la linea 44 comprobando si el primero de los parámetros que recibe el script es «-h», en caso de ser cierto ejecuta la función ayuda y sale indicando una terminación normal.

Si PATRON (primer parámetro según hemos descrito en la linea 15) es «-a», se muestra el autor siguiendo el mismo mecanismo explicado en el párrafo anterior para la opción «-h».

En la linea 56 se controla que no nos haya llegado menos de dos parámetros, en tal caso, se ejecuta la función noparams, seguidamente, en el if de la linea 60 averiguamos si existe el directorio sobre el que queremos hacer la búsqueda, en caso de existir se muestra una linea vacía, el comando find con la dirección del directorio sobre el que queremos efectuar la búsquda seguido del patrón (comienzo del nombre del archivo que estamos buscando) una nueva linea en blanco y mediante exit $? confiamos la salida de nuestro script al resultado producido por find. En caso que la condición de existencia del directorio sea falsa (linea 67) hacemos una llamada a la función nodir y salimos indicando una terminación anormal.

Ejecución y pruebas

$ encontrar
$ encontrar -a
$ encontrar -h
$ encontrar index aljflaskjf #directorio no existe
$ encontrar index public_html
$

En siguientes artículos sobre Bash veremos los mecanismos para usar parámetros en las funciones, asimismo veremos la forma de articular datos de retorno de las mismas.

Espero y deseo que este post haya sido de utilidad para vosotros.


Un comentario, deja el tuyo

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   josea dijo

    Hola,
    muy interesante y muy clarito.
    Solo un apunte; falta un $ en la línea 68 frente a la variable EXIT_BAD.
    Voy a seguir aprendiendo seguro con tus artículos.