Funciones en Bash
Definición y llamada de funciones
Una función en Bash es un bloque de código reutilizable que agrupa comandos para realizar una tarea específica. Las funciones se definen con un nombre seguido de ()
y se ejecutan simplemente escribiendo su nombre.
Ejemplo:
#!/bin/bash
# Definir una función
saludar() {
echo "¡Hola, mundo!"
}
# Llamar a la función ¡sin paréntesis!
saludar
Nota: No necesitas paréntesis al llamar a la función. Las funciones deben definirse antes de llamarse en el script.
Paso de parámetros a funciones
Las funciones pueden recibir parámetros, que se acceden dentro de la función como $1
, $2
, etc., similar a los argumentos de un script. $#
indica el número de parámetros recibidos.
Ejemplo:
#!/bin/bash
# Definir una función que acepta parámetros
presentar() {
echo "Hola, $1. Parece que tienes $2 años."
echo "Recibí un total de $# parámetros."
echo "Todos los parámetros son: $@"
}
# Llamar a la función con parámetros
presentar "Ana" 30 "La Coruña"
echo "---"
presentar "Juan" # Puedes llamar la función con menos parámetros,
# los no definidos serán vacíos
Nota: Los parámetros se separan por espacios al llamar a la función. Usa $@
para acceder a todos los parámetros como una lista.
Cuando se omite un parámetro, los que se pasan se asignan en orden consecutivo. Los parámetros que no fueron proporcionados y que seguirían en la secuencia (es decir, $3, $4, etc.), si solo se pasaron dos estarán vacíos. En el ejemplo anterior, presentar 30 "La Coruña
resultaría "Hola 30, parece que tienes La Coruña años". Lógicamente esto no es lo deseado. Bash asigna los parámetros a la función por orden, y cuando no tiene mas, deja los siguientes vacios.
Para evitarlo, pasa valores vacios "" a los primeros parámetros, si esa es tu intención: presentar "" 30 "La Coruña"
resultará en "Hola,. Parece que tienes 30 años". Asi aseguras que los valores se asignan al parámetro correcto.
Variables locales dentro de funciones
Por defecto, todas las variables en Bash son globales. Esto significa que si defines una variable en tu script principal, una función puede leerla y modificarla. Si defines una variable dentro de una función sin especificar lo contrario, también será global. Esto puede provocar, por ejemplo, que una función cambié el valor de una variable que el resto del script necesita.
Para evitar esto y limitar el alcance de una variable solo al interior de la función, usa la palabra clave local.
Ejemplo:
#!/bin/bash
# Variable global
NOMBRE="Global"
# Definir una función con variable local
prueba() {
local NOMBRE="Local"
echo "Dentro de la función: $NOMBRE"
}
# Llamar a la función
prueba
echo "Fuera de la función: $NOMBRE"
Nota: Sin local
, la función sobrescribiría la variable global. Usa local
para evitar efectos secundarios no deseados.
Devolver valores desde funciones
Las funciones en Bash no "devuelven" valores de la misma forma que lo haría un return en Python o Java para asignar un resultado a una variable. En Bash, hay dos formas principales de manejar la "devolución":
Enviando datos al flujo de salida (stdout): Una función puede simplemente imprimir (usando echo
o printf
) el resultado de su operación. Luego, este resultado se puede capturar desde el exterior de la función usando la sustitución de comandos $( )
.
Devolviendo un código de estado numérico: Las funciones pueden usar return para enviar un código de salida (un número entre 0 y 255). Por convención, 0 indica éxito, y cualquier otro valor (1-255) indica un tipo de error. Este código de estado se accede con la variable especial $?
.
Ejemplo con salida de datos:
#!/bin/bash
# Definir una función que devuelve un valor
sumar() {
local RESULTADO=$(( $1 + $2 ))
echo $RESULTADO
}
# Capturar el valor devuelto
RESULTADO=$(sumar 5 3)
echo "La suma es: $RESULTADO"
Ejemplo con código de estado:
#!/bin/bash
# Definir una función con código de estado
verificar() {
if [ $1 -gt 0 ]; then
return 0 # Éxito
else
return 1 # Error
fi
}
# Usar el código de estado
verificar 5
echo "Código de estado: $?" # Muestra 0
verificar -1
echo "Código de estado: $?" # Muestra 1
Nota: Usa $( )
para capturar la salida de echo
y $?
para obtener el código de estado de return
. Los códigos de estado suelen ser 0 para éxito y cualquier otro valor para error.