Linux en Español

Scripting de bash Parte 6 – Crea y usa Funciones de Bash

En una publicación anterior, hablamos de Funciones de bash, discutamos la situación. Cuando estés escribiendo scripts de bash, te darás cuenta que a veces utilizaras el mismo código en múltiples lugares.

Ademas, si te cansas de escribir las mismas líneas de código una y otra vez en tu script de bash, entonces estaría bien que escribieras este bloque de código una vez y lo llamaras en cualquier parte de tu script de bash.


El bash de shell te permite hacer esto con Funciones.

Las Funciones de bash son bloques de código que puedes reutilizar en cualquier parte de tu código. Siempre que necesites utilizar este bloque de código en tu script, solo escribe el nombre que le diste a la función.

En este artículo hablaremos de cómo puedes crear tus propias funciones de bash y de cómo utilizarla en tus scripts de shell.

 

 

Creando una función

Puedes definir una función de la siguiente forma:

Los paréntesis () son requeridos para definir la función.

Además, puedes definir la función utilizando la palabra clave función, pero esta palabra es obsoleta para la portabilidad del POSIX.

En la segunda definición los paréntesis no son requeridos.

 

Utilizando Funciones

Aquí, creamos una función llamada myfunc y para llamarla solo escribimos su nombre.

bash functions

TLa función puede ser llamada las veces que desees.

Nota: ¿Si intentas utilizar una función que no está definida, que sucederá?

bash functions call before declare

Oh, es un error porque no existe dicha función.

Otra nota: los nombres de las funciones de bash deben ser únicos. De otro modo, las nuevas funciones cancelaran a las antiguas sin errores.

bash functions override definition

Como puedes ver, la segunda definición de la función toma el control y es la que se ejecuta sin ningún error, así que ten cuidado cuanto definas los nombres de las funciones.

 



Utilizando el Comando Return

El comando return retorna un entero desde la función.

Hay dos maneras de utilizar el comando return; la primera es la siguiente:

bash functions return command

La función myfunc suma 10 al calor de la variable $value y luego muestra la suma utilizando la variable $?.

No ejecutes ningún comando antes de obtener el valor de la función porque la variable $? Retorna el estatus de la última vez.

Este método return, retorna enteros. ¿Qué sucede con retornar cadenas de caracteres?

 

Utilizando la Función de salida

TLa segunda manera de retornar un valor de una función de bash es el comando de substitución. De esta manera puedes retornar cualquier cosa de la función.

bash functions output

 


Pasando Parámetros

Podemos lidiar con las funciones básicas del bash como pequeños snippets que pueden ser reutilizados y eso está bien, pero necesitamos además que la función sea como un motor, le ofrecemos algo y en retorno ofrece un resultado de lo que le proporcionamos.

Puedes utilizar las variables de ambiente para procesar los parámetros pasados a la función. El nombre de la función es declarado como la variable $0, y los parámetros pasados son $1, $2, $3, etc.

Puedes obtener el número de parametros pasados a la función utilizando la variable ($#) variable.

Pasamos parámetros de la siguiente forma:

myfunc $val1 10 20

El siguiente ejemplo muestra cómo se utiliza la variable ($#):

bash functions pass parameters

La función addnum obtiene la cuenta de los parámetros pasados. Si es mayor a 2, retorna -1.

Al pasar un parámetro, la función addnum añade este parámetro dos veces. Si se pasan 2 para metros, la función addnum añade ambos y, por último, si intentas añadir 3 parámetros, la función retornará -1.

Si intentas utilizar los parámetros pasados dentro de la función, esta fallará:

bash functions unknown parameters

En su lugar, debes enviarlos a la función de la siguiente manera:

bash functions parameters

¡¡Ahora funciona!!

 


Procesando Variable en Funciones de Bash

Cada variable que utilizamos tiene un alcance, el alcance es la visibilidad de la variable para tu script.

Puedes definir dos tipos de variables:

  • Globales
  • Locales

Variables Globales

Estas son visibles y validas en cualquier parte del script de bash. Incluso puedes obtener su valor desde dentro de la función.

Si declaras una variable global dentro de una función, puedes obtener su valor fuera de la función.

Cualquier variable que declares es global por defecto. Si defines una variable fuera de la función, puedes llamarla desde dentro de la función sin ningún problema:

bash functions global variables

Si cambias el valor de la variable dentro de una función, el valor será modificado fuera de la función.

¿Así que como podemos evitar esto? Utilizando variables locales.

Variables Locales

Además, si tienes dos variables, una dentro de la función y otra fuera de la función con el mismo nombre, no se afectarán entre sí:

local tmp=$(( $val + 10 ))

Cuando utilizas la variable $tmp dentro de la función myfunc, no cambia el valor de la variable $tmp que esta fuera de la función.

bash functions local variables

Cuando utilizas la variable $tmp dentro de la función myfunc, no cambia el valor de la variable $tmp que esta fuera de la función.

 

Pasando Arreglos como Parámetros

Que sucederá si pasas un arreglo como parámetro a una función:

bash functions pass arrays

La función anterior solo toma el primer valor del arreglo.

Debes dividir el arreglo en valores individuales, luego utilizar estos valores como parámetros de la función. Por último, volverlas a colocarlas en un arreglo de la siguiente forma:

bash functions pass arrays solution

La variable de arreglo fue reconstruida gracias a esta función.

 


Funciones Recursivas

Esta característica permite que la función se llame a si misma dentro de la función en sí.

El ejemplo clásico de una función recursiva es el cálculo de la factorial. Para calcular la factorial de 3 utilizamos la siguiente ecuación:

3! = 1 * 2 * 3

En su lugar, podemos utilizar una función recursiva como la que se encuentra a continuación:

x! = x * (x-1)!

Así que para escribir la función factorial utilizando scripting de bash, seria así:

bash recursive function

¡Utilizar funciones recursivas de bash es muy fácil!

 

Creando Librerías

Ahora que sabemos cómo escribir funciones y como llamarlas, pero que sucede si queremos utilizar estas funciones de bash o bloques de código en diferentes archivos de scripts de bash sin tener que copiar y pegar en los archivos.

Puedes crear una librería para tus funciones y apuntar a esa librería cuando lo necesites.

Al utilizar el comando source, puedes integrar el archivo script de la librería dentro de tu script de shell.

El comando source tiene un alias el cual es el punto. Para incluir un archivo como librería en un script de shell, escribe la siguiente línea:

. ./myscript

Asumamos que tenemos un archivo llamado myfuncs que contiene lo siguiente:

Ahora, lo utilizaremos en otro script de bash de la siguiente forma:

bash functions source command

¡¡Increíble!! Utilizamos funciones de bash dentro de nuestro archivo de scripts de bash, también podemos usarlas en el shell directamente.

 

Utilizar Funciones de Bash desde la Línea de Comandos

Bueno, esto es fácil, si leíste la publicación anterior en donde hablamos de señales y trabajos tendrás una idea de cómo utilizar nuestro archivo de funciones en el archivo bashrc, de esta forma pudiendo utilizar las funciones directamente desde el shell de bash. Genial.

Edita el archivo bashrc en /home/username y añade esta línea:

. /home/likegeeks/Desktop/myfuncs

Asegúrate de escribir la ruta correcta.

Ahora la función está disponible para nosotros en la línea de comandos directamente:

$ addnum 10 20

bash functions use from shell

Nota: Tal vez debas salir e ingresar nuevamente para utilizar las funciones de bash en el shell.

Otra nota: si escribes el nombre de una función como cualquiera de los comandos integrados, sobrescribirás ese comando así que debes tener cuidado con eso.

Espero que te gustara la publicación. Vuelve de nuevo cuando quiera.

Gracias.

Mokhtar Ebrahim
Estoy trabajando como administrador de sistemas Linux desde 2010. Soy responsable de mantener, proteger y solucionar problemas de servidores Linux para múltiples clientes de todo el mundo. Me encanta escribir guiones de shell y Python para automatizar mi trabajo.

Deja un comentario

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