Funciones de Shell

ShellShellBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, exploraremos las funciones de shell en Linux. Las funciones de shell son bloques de código reutilizables que realizan tareas específicas, lo que hace que nuestros scripts sean más organizados y eficientes. Aprenderemos cómo crear, llamar y usar funciones con parámetros en scripts de shell. Este laboratorio está diseñado para principiantes, por lo que lo abordaremos paso a paso y explicaremos cada concepto a fondo.

Creando tu Primera Función de Shell

Comencemos creando una simple función de shell. Las funciones de shell son como mini-scripts dentro de un script más grande, lo que te permite agrupar comandos que realizan una tarea específica.

Primero, necesitamos crear un nuevo archivo. Abre tu terminal y escribe:

cd ~/project
touch functions.sh

Este comando cambia al directorio project y crea un nuevo archivo llamado functions.sh. Este archivo contendrá nuestras funciones de shell.

Ahora, agreguemos nuestra primera función:

#!/bin/bash

## Esta es una función simple
greet() {
  echo "Hello, World!"
}

## Esta línea llama (ejecuta) la función
greet

Analicemos esto:

  • La primera línea #!/bin/bash se llama shebang. Le dice al sistema que use bash para interpretar este script.
  • Definimos nuestra función con greet() { }. Todo lo que está entre las llaves es parte de la función.
  • Dentro de la función, tenemos un simple comando echo que imprime "Hello, World!".
  • La última línea greet llama (ejecuta) nuestra función.

Ahora, hagamos que nuestro script sea ejecutable y lo ejecutemos:

chmod +x functions.sh
./functions.sh

Deberías ver:

Hello, World!

Si no ves esta salida, revisa que hayas escrito todo correctamente en el archivo functions.sh.

Funciones con Parámetros

Ahora que hemos creado una función básica, hagámosla más flexible agregando parámetros. Los parámetros nos permiten pasar información a nuestras funciones.

Abre el archivo functions.sh nuevamente y reemplaza el contenido con el siguiente código:

#!/bin/bash

## Función con un parámetro
greet() {
  echo "Hello, $1!"
}

## Función con múltiples parámetros
calculate() {
  echo "The sum of $1 and $2 is $(($1 + $2))"
}

## Llama a las funciones con argumentos
greet "Alice"
calculate 5 3

Examinemos este código:

  • En la función greet, $1 se refiere al primer argumento pasado a la función.
  • En la función calculate, $1 y $2 se refieren al primer y segundo argumento, respectivamente.
  • $(($1 + $2)) realiza la suma aritmética de los dos parámetros.
./functions.sh

Deberías ver:

Hello, Alice!
The sum of 5 and 3 is 8

Si no ves esta salida, asegúrate de haber guardado correctamente los cambios en el archivo.

Valores de Retorno de Funciones

En la programación de shell, las funciones no devuelven valores de la misma manera que en otros lenguajes de programación. En su lugar, pueden mostrar un resultado que se puede capturar mediante echo, o pueden modificar una variable global. Exploremos ambos métodos.

Abre functions.sh nuevamente y actualiza el contenido con el siguiente código:

#!/bin/bash

## Función que muestra un resultado mediante echo
get_square() {
  echo $(($1 * $1))
}

## Función que modifica una variable global
RESULT=0
set_global_result() {
  RESULT=$(($1 * $1))
}

## Captura el resultado mostrado por echo
square_of_5=$(get_square 5)
echo "The square of 5 is $square_of_5"

## Usa la función para modificar la variable global
set_global_result 6
echo "The square of 6 is $RESULT"

Analicemos esto:

  • La función get_square utiliza echo para mostrar el resultado, que capturamos utilizando la sintaxis $().
  • La función set_global_result modifica la variable global RESULT.
  • Usamos $() para capturar la salida de get_square en una variable.
  • Llamamos a set_global_result, que modifica RESULT, y luego mostramos RESULT.

Guarda el archivo y ejecútalo:

./functions.sh

Deberías ver:

The square of 5 is 25
The square of 6 is 36

Si no ves esta salida, revisa el archivo functions.sh para detectar posibles errores tipográficos.

Comprendiendo el Alcance de las Variables

En los scripts de shell, las variables son globales por defecto. Esto significa que se pueden acceder desde cualquier parte del script. Sin embargo, se puede utilizar la palabra clave local para crear variables que solo sean accesibles dentro de una función. Esto se llama alcance local (local scope).

Modifiquemos nuestro archivo functions.sh para demostrar este concepto.

Actualiza el contenido con el siguiente código:

#!/bin/bash

## Variable global
GLOBAL_VAR="I'm global"

## Función con una variable local
demonstrate_scope() {
  local LOCAL_VAR="I'm local"
  echo "Inside function: GLOBAL_VAR = $GLOBAL_VAR"
  echo "Inside function: LOCAL_VAR = $LOCAL_VAR"
}

## Llama a la función
demonstrate_scope

echo "Outside function: GLOBAL_VAR = $GLOBAL_VAR"
echo "Outside function: LOCAL_VAR = $LOCAL_VAR"

Esto es lo que está sucediendo en este script:

  • Definimos una variable global GLOBAL_VAR.
  • Dentro de la función demonstrate_scope, definimos una variable local LOCAL_VAR utilizando la palabra clave local.
  • Mostramos ambas variables dentro de la función.
  • Después de llamar a la función, intentamos mostrar ambas variables nuevamente fuera de la función.

Guarda el archivo y ejecútalo:

./functions.sh

Deberías ver una salida similar a esta:

Inside function: GLOBAL_VAR = I'm global
Inside function: LOCAL_VAR = I'm local
Outside function: GLOBAL_VAR = I'm global
Outside function: LOCAL_VAR =

Observa que LOCAL_VAR está vacía cuando se accede fuera de la función. Esto se debe a que las variables locales solo son accesibles dentro de la función donde se definen.

Función Avanzada - ENGLISH_CALC

Ahora que hemos cubierto los conceptos básicos de las funciones de shell, creemos una función más avanzada llamada ENGLISH_CALC. Esta función tomará tres argumentos: dos números y una operación (plus, minus o times).

Reemplaza el contenido con el siguiente código:

#!/bin/bash

ENGLISH_CALC() {
  local num1=$1
  local operation=$2
  local num2=$3
  local result

  case $operation in
    plus)
      result=$((num1 + num2))
      echo "$num1 + $num2 = $result"
      ;;
    minus)
      result=$((num1 - num2))
      echo "$num1 - $num2 = $result"
      ;;
    times)
      result=$((num1 * num2))
      echo "$num1 * $num2 = $result"
      ;;
    *)
      echo "Invalid operation. Please use 'plus', 'minus', or 'times'."
      return 1
      ;;
  esac
}

## Test the function
ENGLISH_CALC 3 plus 5
ENGLISH_CALC 5 minus 1
ENGLISH_CALC 4 times 6
ENGLISH_CALC 2 divide 2 ## This should show an error message

Analicemos esta función:

  • Utilizamos variables local para almacenar nuestras entradas y resultados. Esta es una buena práctica para evitar interferir con cualquier variable global.
  • Utilizamos una declaración case para manejar diferentes operaciones. Esto es similar a una declaración switch en otros lenguajes.
  • Para cada operación válida, realizamos el cálculo y mostramos el resultado.
  • Si se proporciona una operación no válida, mostramos un mensaje de error y devolvemos 1 (en los scripts de shell, un valor de retorno distinto de cero indica un error).
  • Al final, probamos nuestra función con varias entradas, incluyendo una operación no válida.

Guarda el archivo y ejecútalo:

./functions.sh

Deberías ver la siguiente salida:

3 + 5 = 8
5 - 1 = 4
4 * 6 = 24
Invalid operation. Please use 'plus', 'minus', or 'times'.

Si no ves esta salida, revisa el archivo functions.sh para detectar posibles errores tipográficos.

Resumen

En este laboratorio, exploramos las funciones de shell en Linux, comenzando desde los conceptos básicos y avanzando hacia conceptos más complejos. Aprendimos cómo:

  1. Crear y llamar funciones simples
  2. Trabajar con parámetros de funciones
  3. Devolver valores de funciones utilizando echo y variables globales
  4. Comprender el alcance de las variables y utilizar variables locales
  5. Crear una función más compleja que procese operaciones aritméticas

Las funciones de shell son herramientas poderosas que pueden ayudarte a escribir código más organizado, eficiente y reutilizable. Te permiten dividir scripts complejos en piezas más pequeñas y manejables, lo que hace que tus scripts sean más fáciles de entender y mantener.

Al dominar las funciones de shell, podrás escribir scripts de shell más sofisticados y automatizar tareas complejas de manera más efectiva en un entorno Linux. Recuerda, la práctica es la clave para dominar la programación de shell. Intenta modificar las funciones que hemos creado o crea las tuyas propias para resolver problemas específicos que encuentres en tu trabajo con Linux.