7. Funciones y Modularización del Código

Los scripts que has hecho hasta ahora funcionan bien, pero tienen un problema: si el código crece, se convierte en algo difícil de mantener, leer y modificar. Las funciones solucionan esto al permitir reutilizar código y dividirlo en partes más pequeñas.

Este módulo te enseñará a definir funciones, pasar argumentos, devolver valores y modularizar scripts más complejos.


1. ¿Qué es una función en Bash?

Una función es un bloque de código con nombre propio que puedes ejecutar cuando quieras, tantas veces como quieras.

En pseudolenguaje:





definir función → hacer algo
llamar función → ejecuta ese algo

2. Sintaxis para definir funciones

Bash acepta dos sintaxis equivalentes:

Forma 1:





nombre_funcion() {
    comandos
}

Forma 2:





function nombre_funcion {
    comandos
}

Ambas son válidas. Lo más usado es la primera por ser más limpia.


3. Llamar a una función

Una vez definida, basta con usar su nombre:





mi_funcion

Ejemplo:





saludar() {
    echo "Hola desde la función"
}

saludar

Salida:





Hola desde la función

4. Funciones con parámetros

Las funciones pueden recibir argumentos igual que el script completo.

Ejemplo:





saludar() {
    echo "Hola $1"
}

saludar "Laura"

Salida:





Hola Laura

Si deseas más parámetros:

  • $1 → primer argumento
  • $2 → segundo
  • $@ → todos

5. Funciones que devuelven valores

En Bash una función no “devuelve” valores como en otros lenguajes. Lo más común es:

  • Imprimir en pantalla
  • Guardar en variables
  • O usar return solo para códigos numéricos (0–255)

5.1 Método estándar (captura por sustitución)





sumar() {
    echo $(( $1 + $2 ))
}

resultado=$(sumar 3 4)
echo "Resultado: $resultado"

Salida:





Resultado: 7

5.2 return (solo numérico)





comparar() {
    if [ $1 -gt $2 ]; then
        return 0
    else
        return 1
    fi
}

comparar 10 5

if [ $? -eq 0 ]; then
    echo "El primero es mayor"
fi

6. Variables locales vs globales

Por defecto, las variables en Bash son globales dentro del script.

Para limitar su alcance dentro de la función, usa local:





prueba() {
    local mensaje="Hola"
    echo "$mensaje"
}

prueba
echo "$mensaje"  # Está vacía fuera de la función

7. Organización modular del código

A partir de ahora puedes:

  • Definir varias funciones en un mismo script
  • Usar funciones como “bloques” lógicos
  • Separar responsabilidades

Ejemplo de script modular:





mostrar_menu() {
    echo "1) Fecha"
    echo "2) Usuario"
    echo "3) Salir"
}

procesar_opcion() {
    case $1 in
        1) date ;;
        2) echo $USER ;;
        3) exit ;;
        *) echo "Opción inválida" ;;
    esac
}

mostrar_menu
read -p "Opción: " op
procesar_opcion $op

8. Incluir funciones desde otros archivos (source)

Esto permite crear “librerías” de funciones.

Por ejemplo, en utils.sh:





saludar() {
    echo "Hola $1"
}

En otro script:





source utils.sh
saludar "Carlos"

Esto se usa para:

  • reutilizar código
  • crear módulos de funciones
  • evitar duplicar scripts

9. Ejemplos

Ejemplo 1: Función suma





sumar() {
    echo $(( $1 + $2 ))
}

resultado=$(sumar 5 3)
echo "Resultado: $resultado"

Ejemplo 2: Librería simple

log.sh:





log() {
    echo "[LOG] $1"
}

test.sh:





source log.sh
log "Esto es una prueba"

Ejemplo 3: Comprobador de archivos





existe() {
    if [ -f "$1" ]; then
        echo "El archivo existe"
    else
        echo "No existe"
    fi
}

existe "/etc/passwd"

Ejercicios propuestos

Ejercicio 1:
Crear un script matematicas.sh con funciones:

  • sumar
  • restar

Cada función recibe 2 números y muestra el resultado.

Ejercicio 2:
Crear un script saludos.sh con una función saludar que reciba un nombre y muestre:





Hola, <nombre>

Ejercicio 3:
Crear un script menu.sh con una función menu que muestre:

  1. Mostrar fecha
  2. Mostrar usuario
  3. Salir

Y llame a otras funciones según la opción.

Ejercicio 4:
Crear un archivo utilidades.sh con una función log que agregue un mensaje a un archivo registro.txt.
Luego crear un script test.sh que llame a log usando source.

Soluciones

✅ Ejercicio 1 — matematicas.sh

Enunciado:
Crear un script matematicas.sh con funciones:

  • sumar
  • restar

Cada función recibe 2 números y muestra el resultado.

💡 Solución:





#!/bin/bash
# Script: matematicas.sh
# Funciones para sumar y restar dos números

sumar() {
    # $1 y $2 son los parámetros de la función
    resultado=$(( $1 + $2 ))
    echo "La suma de $1 + $2 es $resultado"
}

restar() {
    resultado=$(( $1 - $2 ))
    echo "La resta de $1 - $2 es $resultado"
}

# Ejemplos de uso (se pueden sustituir por lectura de parámetros)
sumar 10 5
restar 10 5

Si quieres que usen parámetros del script en lugar de valores fijos:





#!/bin/bash

sumar() {
    echo "La suma de $1 + $2 es $(( $1 + $2 ))"
}

restar() {
    echo "La resta de $1 - $2 es $(( $1 - $2 ))"
}

sumar "$1" "$2"
restar "$1" "$2"

✅ Ejercicio 2 — saludos.sh

Enunciado:
Crear un script saludos.sh con una función saludar que reciba un nombre y muestre:

Hola, <nombre>

💡 Solución:





#!/bin/bash
# Script: saludos.sh
# Función saludar que recibe un nombre

saludar() {
    nombre="$1"
    echo "Hola, $nombre"
}

# Ejemplo 1: pasar el nombre como parámetro al script
# saludar "$1"

# Ejemplo 2: pedirlo por teclado
read -p "Introduce tu nombre: " nom
saludar "$nom"

✅ Ejercicio 3 — menu.sh

Enunciado:
Crear un script menu.sh con una función menu que muestre:

  1. Mostrar fecha
  2. Mostrar usuario
  3. Salir

Y llame a otras funciones según la opción.

💡 Solución:





#!/bin/bash
# Script: menu.sh
# Menú con funciones para organizar el código

mostrar_fecha() {
    echo "Fecha actual: $(date +"%Y-%m-%d %H:%M:%S")"
}

mostrar_usuario() {
    echo "Usuario actual: $USER"
}

menu() {
    echo "==== MENÚ ===="
    echo "1) Mostrar fecha"
    echo "2) Mostrar usuario"
    echo "3) Salir"
}

# Bucle para que el menú se repita hasta salir
while true; do
    menu
    read -p "Elige una opción: " opcion

    case "$opcion" in
        1) mostrar_fecha ;;
        2) mostrar_usuario ;;
        3) echo "Saliendo..."; exit 0 ;;
        *) echo "Opción no válida" ;;
    esac

    echo # línea en blanco para separar
done

✅ Ejercicio 4 — utilidades.sh + test.sh

Enunciado:

  1. Crear un archivo utilidades.sh con una función log que agregue un mensaje a un archivo registro.txt.
  2. Crear un script test.sh que llame a log usando source.

💡 utilidades.sh





#!/bin/bash
# Archivo: utilidades.sh
# Contiene funciones reutilizables

log() {
    mensaje="$1"
    fecha=$(date +"%Y-%m-%d %H:%M:%S")
    echo "[$fecha] $mensaje" >> registro.txt
}

Importante: este archivo no se ejecuta solo, se “incluye” desde otros scripts.


💡 test.sh





#!/bin/bash
# Script: test.sh
# Usa la función log de utilidades.sh

# Cargar funciones desde utilidades.sh
source ./utilidades.sh

log "Inicio de la ejecución de test.sh"
echo "He escrito una línea en registro.txt"

# Puedes añadir más registros
log "Otra acción importante realizada"

Al ejecutar:





chmod +x test.sh
./test.sh

Contenido de registro.txt (ejemplo):





[2026-01-11 19:30:01] Inicio de la ejecución de test.sh
[2026-01-11 19:30:01] Otra acción importante realizada