Las funciones en scripts de shell pueden ser invocadas de diversas maneras:
- Directamente desde la línea de comandos del shell.
- Dentro de la ejecución de un script.
- Importando funciones definidas en archivos externos.
- Mediante llamadas recursivas.
- Invocación Directa en la Línea de Comandos
Puedes definir y ejecutar una función directamente en tu terminal.
$ obtener_fecha_anterior() { date --date='1 day ago'; }
$ obtener_fecha_anterior
Lun May 25 11:36:03 CST 2020
- Invocación Dentro de un Script
Para llamar a una función desde un script, esta debe ser definida antes de su punto de invocación.
# Archivo: script_fecha.sh
#!/bin/bash
# Definición de la función
obtener_fecha_anterior() {
date --date='1 day ago'
}
# Invocación de la función dentro del script
obtener_fecha_anterior
# Ejecución del script
$ ./script_fecha.sh
Lun May 25 11:37:35 CST 2020
Si la función se envoca antes de su definición, resultará en un error.
# Archivo: script_fecha_erroneo.sh
#!/bin/bash
# Intento de invocación antes de la definición
obtener_fecha_anterior
# Definición de la función
obtener_fecha_anterior() {
date --date='1 day ago'
}
# Ejecución del script
$ ./script_fecha_erroneo.sh
./script_fecha_erroneo.sh: line 4: obtener_fecha_anterior: command not found
- Invocación desde Archivos de Funciones
Las funciones pueden ser almacenadas en archivos separados y luego cargadas en el entorno del shell actual o en un script.
Carga mediante el comando . (source)
El comando . (equivalente a source) carga las definiciones de funciones de un archivo en la sesión actual.
# Archivo: funciones_fecha.sh
#!/bin/bash
obtener_fecha_anterior() {
date --date='1 day ago'
}
# Archivo: script_principal.sh
#!/bin/bash
# Cargar las funciones desde el archivo externo
. /ruta/a/funciones_fecha.sh
# Invocar la función cargada
obtener_fecha_anterior
# Ejecución del script principal
$ ./script_principal.sh
Lun May 25 11:45:55 CST 2020
Uso de source con parámetros
El comando source también puede ejecutar código dentro del archivo de funciones y pasarle argumentos.
# Archivo: funciones_ejemplo.sh
#!/bin/bash
procesar_argumentos() {
local script_actual="$0"
local argumentos_recibidos="$*"
echo "Script actual: $script_actual, Argumentos: $argumentos_recibidos"
}
# Archivo: script_invocador.sh
#!/bin/bash
# Cargar el archivo de funciones y pasarle un argumento
source /ruta/a/funciones_ejemplo.sh mi_argumento
# Invocar una función definida en el archivo cargado
procesar_argumentos
# Ejecución del script invocador
$ ./script_invocador.sh
Script actual: ./script_invocador.sh, Argumentos: mi_argumento
Esto también funciona directamente en la línea de comandos:
$ obtener_fecha_anterior # Sin cargar el archivo
-bash: obtener_fecha_anterior: command not found
$ source funciones_fecha.sh # Cargar el archivo
$ obtener_fecha_anterior # Ahora se puede invocar
Lun May 25 11:48:24 CST 2020
- Llamadas Recursivas
Una función puede llamarse a sí misma. Sin embargo, en shell scripting, las llamadas recursivas suelen ser lentas y se recomienda evitarlas si es posible.
# Archivo: factorial.sh
#!/bin/bash
calcular_factorial(){
local numero=$1
local resultado
# Declarar variables como enteros para asegurar operaciones numéricas
declare -i numero
declare -i resultado
# Caso base de la recursión: si el número es 2 o menos, devolver el número.
# De lo contrario, calcular el factorial del número anterior y multiplicar por el número actual.
[ "$numero" -le 2 ] && echo "$numero" || {
resultado=$(( numero - 1 ))
resultado=$(calcular_factorial "$resultado") # Llamada recursiva
resultado=$(( resultado * numero ))
echo "$resultado"
}
}
# Validar que se proporcionó un argumento
if [ $# -eq 0 ]; then
echo "Uso: $0 <n>"
exit 1
fi
# Invocar la función con el argumento proporcionado
calcular_factorial "$1"
# Ejecución de ejemplo
$ ./factorial.sh
Uso: ./factorial.sh <n>
$ ./factorial.sh 0
0
$ ./factorial.sh 1
1
$ ./factorial.sh 2
2
$ ./factorial.sh 5
120
</n></n>