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
- Devolviendo Arrays con Sustitución de Comandos
- Devolviendo Arrays con IFS
- Eligiendo el Mejor Método
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:
my_array_function
crea un array local.- Usa
echo
,tr
para reemplazar espacios con saltos de línea ypaste
para unir los elementos con el delimitador. - La sustitución de comandos captura la salida en
returned_string
. - 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:
my_array_function
guarda el IFS actual.- Establece IFS en un carácter de nueva línea.
- Imprime cada elemento del array en una nueva línea.
- Restaura IFS.
- 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.