Bash Scripting

Devolviendo Eficientemente Arreglos desde Funciones Bash

Spread the love

Bash no admite directamente la devolución de arrays desde funciones. Sin embargo, podemos lograrlo usando técnicas ingeniosas. Este artículo explora dos métodos efectivos: usando sustitución de comandos y manipulando el Separador de Campos Interno (IFS).

Tabla de Contenidos

Sustitución de Comandos

La sustitución de comandos captura la salida de un comando y la asigna a una variable. Esto forma la base de nuestro primer método. La clave es formatear la salida de la función para facilitar su análisis y conversión de nuevo en un array.

Devolviendo Arrays con Sustitución de Comandos

Este método implica unir los elementos del array en una cadena usando un delimitador, y luego dividir la cadena de nuevo en un array. Veamos un ejemplo:


my_array_function() {
  local array=("manzana" "plátano" "cereza")
  local delimiter="|"
  echo "${array[*]}" | tr ' ' 'n' | paste -sd"$delimiter" -
}

returned_string=$(my_array_function)
returned_array=(${returned_string//|$delimiter/ })

echo "Array devuelto: ${returned_array[@]}"

Así es como funciona:

  1. my_array_function crea un array local.
  2. Usa echo, tr para reemplazar espacios con saltos de línea y paste para unir los elementos con el delimitador.
  3. La sustitución de comandos captura la salida en returned_string.
  4. La expansión de parámetros reemplaza el delimitador con espacios para crear el array returned_array.

Este enfoque es simple y efectivo, pero el delimitador no debe aparecer en los elementos del array. Si lo hace, considere usar un carácter menos común o un método de manejo de delimitadores más robusto.

Devolviendo Arrays con IFS

El Separador de Campos Interno (IFS) controla cómo Bash divide las cadenas en palabras. Podemos aprovechar esto para devolver arrays estableciendo IFS dentro de la función e imprimiendo los elementos del array. El script que llama luego usa el IFS modificado para analizar la salida.


my_array_function() {
  local array=("manzana" "plátano" "cereza")
  local old_ifs="$IFS"
  IFS=$'n'
  printf "%sn" "${array[@]}"
  IFS="$old_ifs"
}

returned_array=($(my_array_function))

echo "Array devuelto: ${returned_array[@]}"

Explicación:

  1. my_array_function guarda el IFS actual.
  2. Establece IFS en un carácter de nueva línea.
  3. Imprime cada elemento del array en una nueva línea.
  4. Restaura IFS.
  5. El script que llama usa la nueva línea como separador para crear el array.

Este método es más limpio si los elementos de su array no contienen nuevas líneas. Para elementos que contienen nuevas líneas, debe elegir un carácter IFS diferente y menos probable.

Eligiendo el Mejor Método

Ambos métodos ofrecen soluciones viables. La mejor opción depende de sus necesidades específicas y del contenido del array. El enfoque de sustitución de comandos ofrece más flexibilidad en la selección del delimitador, mientras que usar IFS puede ser más limpio si sus datos lo permiten. Siempre priorice un código limpio, robusto y bien comentado.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *