Explorando las Formas de Invocar Funciones en Shell Scripting

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.
  1. 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

  1. 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

  1. 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

  1. 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>

Etiquetas: shell scripting bash funciones recursion source

Publicado el 7-6 23:07