Introducción
Una función Bash es esencialmente un conjunto de comandos que se pueden llamar varias veces. El propósito de una función es ayudarlo a hacer que sus scripts de bash sean más legibles y evitar escribir el mismo código varias veces.
En comparación con la mayoría de los lenguajes de programación, las funciones de Bash son bastante limitadas. En este tutorial, cubriremos los conceptos básicos de las funciones de Bash y le mostraremos cómo usarlas en scripts de shell.
Declaración de la función Bash
La sintaxis para declarar una función bash es muy simple. Se pueden declarar en dos formatos diferentes.
El primer formato comienza con el nombre de la función, seguido de paréntesis. Este es el formato preferido y más utilizado.
function_name () {
commands
}
Versión de una sola fila:
function_name () { commands; }
El segundo formato comienza con la function
seguida por el nombre de la función.
function function_name {
commands
}
Versión de una sola fila:
function function_name { commands; }
Notar:
- La lista de comandos entre llaves
{}
es el cuerpo de la función. Los corchetes que rodean el cuerpo de la función deben estar separados del cuerpo por espacios o nuevas líneas. - Definir una función no la realiza. Para invocar una función bash, simplemente use el nombre de la función. Los comandos entre llaves se ejecutan cada vez que se llama a la función en el script de shell.
- La definición de función debe insertarse antes de cualquier llamada a la función.
- Cuando se utilizan funciones "empaquetadas" de una sola línea, un punto y coma
;
debe seguir el último comando de la función. - Siempre debe intentar que los nombres de sus funciones sean descriptivos.
Para entender esto mejor, eche un vistazo al siguiente ejemplo:
#!/bin/bash
hello_world () {
echo 'hello, world'
}
hello_world
Repasemos el código línea por línea:
- En la línea
3
estamos definiendo la función dándole un nombre y abriendo la llave{
que marca el comienzo del cuerpo de la función. - La línea
4
es el cuerpo de la función. El cuerpo de la función puede contener múltiples comandos y declaraciones de variables. - La línea
5
, la llave de cierre}
, define el final de la funciónhello_world
- En la línea
7
estamos ejecutando la función. Puede ejecutar la función tantas veces como sea necesario.
Si ejecuta el script, hello, world
se imprimirá el mundo.
Variables de alcance
Las variables globales son variables a las que se puede acceder desde cualquier lugar del script independientemente del alcance. En Bash, todas las variables predeterminadas se definen como globales, incluso si se declaran dentro de la función.
Las variables locales se pueden declarar en el cuerpo de la función con la palabra clave local
y solo se pueden usar dentro de esa función. Puede tener variables locales con el mismo nombre en varias funciones.
Para ilustrar mejor cómo funciona el alcance variable en Bash, consideremos un ejemplo:
#!/bin/bash
var1='A'
var2='B'
my_function () {
local var1='C'
var2='D'
echo "Inside function: var1: $var1, var2: $var2"
}
echo "Before executing function: var1: $var1, var2: $var2"
my_function
echo "After executing function: var1: $var1, var2: $var2"
El script comienza definiendo dos variables globales var1
y var2
. Luego, una función que establece una variable local var1
y cambia la variable global var2
.
Si ejecuta el script, debería ver el siguiente resultado:
Before executing function: var1: A, var2: B
Inside function: var1: C, var2: D
After executing function: var1: A, var2: D
De la salida anterior, podemos concluir que:
- Si establece una variable local dentro del cuerpo de la función con el mismo nombre que una variable global existente, tendrá prioridad sobre la variable global.
- Las variables globales se pueden cambiar dentro de la función.
Valores devueltos
A diferencia de las funciones en lenguajes de programación "reales", las funciones Bash no le permiten devolver un valor cuando se las llama. Cuando se completa una función bash, su valor de retorno es el estado de la última instrucción ejecutada en la función, el valor 0
indica el éxito de la función, mientras que un número decimal distinto de cero en el rango 1 - 255 indica un error.
El estado de devolución se puede especificar mediante la return
y se asigna a la variable $?
. La return
termina la función. Puede considerarlo como el estado de salida de la función.
#!/bin/bash
my_function () {
echo "some result"
return 55
}
my_function
echo $?
some result
55
Para devolver un valor arbitrario de una función, necesitamos usar otros métodos. La opción más sencilla es asignar el resultado de la función a una variable global:
#!/bin/bash
my_function () {
func_result="some result"
}
my_function
echo $func_result
some result
Otra mejor opción para devolver un valor de una función es enviar el valor a stdout
usando echo
o printf
como se muestra a continuación:
#!/bin/bash
my_function () {
local func_result="some result"
echo "$func_result"
}
func_result="$(my_function)"
echo $func_result
some result
En lugar de simplemente ejecutar la función que imprimirá el mensaje en stdout, estamos asignando la salida de la función a la func_result
usando la sustitución del comando $()
La variable se puede utilizar posteriormente según sea necesario.
Pasar argumentos a funciones Bash
Para pasar cualquier número de argumentos a la función bash, insértelos inmediatamente después del nombre de la función, separados por un espacio. Es una buena idea citar argumentos dos veces para evitar un análisis incorrecto de un argumento con espacios.
- Los parámetros pasados son
$1
,$2
,$3
...$n
, correspondientes a la posición del parámetro después del nombre de la función. - La
$0
está reservada para el nombre de la función. - La variable
$#
contiene el número de parámetros /argumentos posicionales pasados a la función. - Las variables
$*
y$@
contienen todos los parámetros /argumentos posicionales pasados a la función. - Cuando está entre comillas dobles,
"$*"
expande a una sola cadena separada por espacios (el primer carácter de IFS) -"$1 $2 $n"
. - Cuando está entre comillas dobles,
"$@"
expande en cadenas separadas -"$1" "$2" "$n"
. - Cuando no se cotizan dos veces,
$*
y$@
son lo mismo.
Aquí hay un ejemplo:
#!/bin/bash
greeting () {
echo "Hello $1"
}
greeting "Joe"
Hello Joe
Conclusión
Una función Bash es un bloque de código reutilizable diseñado para realizar una operación en particular. Una vez definida, la función se puede llamar varias veces dentro de un script.
También puede leer cómo usar una función Bash para crear un alias con bash.