
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 bash sean más legibles y evitar escribir el mismo código repetidamente. En comparación con la mayoría de los lenguajes de programación, las funciones de Bash son algo limitadas.
En este tutorial, cubriremos los conceptos básicos de las funciones de Bash y le mostraremos cómo usarlas en sus scripts de shell.
Definiendo funciones Bash #
La sintaxis para declarar una función bash es sencilla. Las funciones 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 línea:
function_name () { commands; }
-
El segundo formato comienza con la palabra reservada
function
, seguido del nombre de la función.function function_name { commands }
Versión de una sola línea:
function function_name { commands; }
Algunos puntos a tener en cuenta:
- Los comandos entre llaves (
{}
) se llaman el cuerpo de la función. Las llaves deben estar separadas del cuerpo por espacios o saltos de línea. - Definir una función no la ejecuta. 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 la función debe colocarse antes de cualquier llamada a la función.
- Al usar funciones "compactas" de una sola línea, un punto y coma
;
debe seguir el último comando en la función. - Siempre trate de mantener los nombres de sus funciones descriptivos.
Para entender esto mejor, echa un vistazo al siguiente ejemplo:
~/hola_mundo.sh#!/bin/bash
hello_world () {
echo 'hello, world'
}
hello_world
Analicemos el código línea por línea:
- En la línea 3, estamos definiendo la función dándole un nombre. La llave
{
marca el inicio del cuerpo de la función. - Línea
4
es el cuerpo de la función. El cuerpo de la función puede contener múltiples comandos, sentencias y declaraciones de variables. - Línea
5
, el corchete de cierre}
, define el final dehello_world
función. - En línea
7
estamos ejecutando la función. Puede ejecutar la función tantas veces como necesite.
Si ejecuta el script, imprimirá hello, world
.
Ámbito de variables #
Las variables globales son variables a las que se puede acceder desde cualquier parte del script, independientemente del alcance. En Bash, todas las variables por defecto se definen como globales, incluso si se declaran dentro de la función.
Las variables locales se pueden declarar dentro del cuerpo de la función con local
palabra clave y solo se puede usar dentro de esa función. Puede tener variables locales con el mismo nombre en diferentes funciones.
Para ilustrar mejor cómo funciona el alcance de las variables en Bash, consideremos este ejemplo:
~/variables_scope.sh#!/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 hay una función que establece una variable local var1
y modifica 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
Del resultado anterior, podemos concluir que:
- Cuando una variable local se establece 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 desde dentro de la función.
Valores devueltos #
A diferencia de las funciones en los lenguajes de programación "reales", las funciones de 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, 0
para el éxito y un número decimal distinto de cero en el rango de 1 a 255 para el fracaso.
El estado de devolución se puede especificar usando el return
palabra clave, y se asigna a la variable $?
. El return
sentencia finaliza 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:
~/return_values.sh#!/bin/bash
my_function () {
func_result="some result"
}
my_function
echo $func_result
some result
Otra opción mejor para devolver un valor de una función es enviar el valor a stdout
usando echoor 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 la salida estándar, estamos asignando la salida de la función a func_result
variable usando el $()
sustitución de mando. La variable se puede usar más tarde según sea necesario.
Pasar argumentos a funciones Bash #
Para pasar cualquier cantidad de argumentos a la función bash, simplemente colóquelos justo después del nombre de la función, separados por un espacio. Es una buena práctica usar comillas dobles en los argumentos para evitar el análisis erróneo de un argumento con espacios.
- Los parámetros pasados son
$1
,$2
,$3
…$n
, correspondiente a la posición del parámetro después del nombre de la función. - El
$0
la variable está reservada para el nombre de la función. - El
$#
variable contiene el número de parámetros/argumentos posicionales pasados a la función. - El
$*
y$@
las variables contienen todos los parámetros/argumentos posicionales pasados a la función.- Cuando está entre comillas dobles,
"$*"
se expande a una sola cadena separada por espacios (el primer carácter de IFS) -"$1 $2 $n"
. - Cuando está entre comillas dobles,
"$@"
se expande a cadenas separadas -"$1" "$2" "$n"
. - Cuando no está entre comillas dobles,
$*
y$@
son iguales.
- Cuando está entre comillas dobles,
Aquí hay un ejemplo:
~/passing_arguments.sh#!/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 particular. Una vez definida, la función se puede llamar varias veces dentro de un script.
También puede leer acerca de cómo usar una función Bash para crear un comando de acceso directo fácil de recordar para un comando más largo.
Si tiene alguna pregunta o comentario, no dude en dejar un comentario.