Devolver una matriz en Bash

Olorunfemi Akinlua 20 junio 2023
  1. Sustitución de comandos
  2. Use la sustitución de comandos para devolver una matriz en Bash
  3. Use IFS para devolver una matriz en Bash
Devolver una matriz en Bash

Dado que Bash no maneja arreglos, devolver un arreglo puede ser un poco difícil. Sin embargo, es factible superar esta restricción utilizando una variable global o una solución alternativa de sustitución de comandos para devolver una matriz desde una función.

Este artículo cubrirá la sustitución de comandos, un método para devolver una matriz en bash sin necesidad de variables globales.

Sustitución de comandos

Para entender cómo funciona esto, primero debemos entender qué es la sustitución de comandos y cómo funciona en Bash.

La característica de Bash llamada sustitución de comando permite usar la salida de un comando en lugar del comando en sí. Esto se hace encerrando el comando en un par de acentos graves (``) o $(), así:

echo "The current date is: `date`"

Producción :

The current date is: Fri Nov 29 16:14:23 PST 2022

El comando fecha se ejecuta en el ejemplo anterior, y su salida se sustituye en lugar del comando en sí. Esto nos permite incrustar la salida de un comando directamente en una cadena, lo que puede ser útil en muchas situaciones.

Use la sustitución de comandos para devolver una matriz en Bash

Ahora, veamos cómo podemos usar la sustitución de comandos para devolver una matriz desde una función en Bash.

Primero, creemos una función llamada get_array que devuelva una matriz de números del 1 al 10 y use la sustitución de comandos. Luego, llame a la función y almacene la salida en una variable, resultado, que imprimiremos.

function get_array() {
  local my_array=(1 2 3 4 5 6 7 8 9 10)

  echo "${my_array[@]}"
}

result=$(get_array)

echo "The result is: $result"

Producción :

The result is: 1 2 3 4 5 6 7 8 9 10

En la función anterior, creamos una matriz llamada my_array que contiene los números del 1 al 10. Luego usamos echo para imprimir la matriz y encerrarla entre comillas para garantizar que los elementos de la matriz se conserven como una sola cadena. Luego, llamamos a la función get_array y almacenamos su salida en la variable resultado. Luego imprimimos el contenido de la variable resultado, que debería ser la matriz de números del 1 al 10.

Use IFS para devolver una matriz en Bash

Veamos ahora cómo podemos obtener los elementos de la matriz. Dado que los elementos de la matriz se devuelven como una sola cadena, necesitamos usar la variable IFS (separador de campo interno) para dividir la cadena en elementos individuales.

La variable IFS controla cómo bash divide una cadena en palabras o tokens. De forma predeterminada, IFS se establece en espacio, tabulador y nueva línea, lo que significa que bash dividirá una cadena en palabras en cualquiera de estos caracteres.

Para dividir la cadena devuelta por la función get_array en elementos individuales, necesitamos establecer IFS en un carácter de espacio:

IFS=' '

result=$(get_array)

result_array=($result)

for i in "${!result_array[@]}"; do
echo "Element $i: ${result_array[$i]}"
done

Producción :

Element 0: 1
Element 1: 2
Element 2: 3
Element 3: 4
Element 4: 5
Element 5: 6
Element 6: 7
Element 7: 8
Element 8: 9
Element 9: 10

En el código anterior, configuramos IFS en un carácter de espacio, lo que nos permite dividir la cadena devuelta por la función get_array en elementos individuales. Luego almacenamos el resultado en la variable result_array y usamos un ciclo for para imprimir los elementos de la matriz.

Veamos ahora cómo este método puede devolver una matriz de cadenas en lugar de una matriz de números.

Primero, modifiquemos la función get_array para devolver una matriz de cadenas:

function get_array() {
  local my_array=("one" "two" "three" "four" "five" "six" "seven" "eight" "nine" "ten")

  # Return the array using the command substitution
  echo "${my_array[@]}"
}

En la función anterior, creamos una matriz llamada mi_matriz que contiene las cadenas uno a diez. Luego usamos echo para imprimir la matriz y encerrarla entre comillas para garantizar que los elementos de la matriz se conserven como una sola cadena.

Ahora examinemos cómo podemos utilizar la función get_array para devolver la matriz de cadenas:

IFS=' '

result=$(get_array)

result_array=($result)

for i in "${!result_array[@]}"; do
  echo "Element $i: ${result_array[$i]}"
done

Producción :

Element 0: one
Element 1: two
Element 2: three
Element 3: four
Element 4: five
Element 5: six
Element 6: seven
Element 7: eight
Element 8: nine
Element 9: ten

En el código anterior, llamamos a la función get_array y almacenamos su salida en la variable resultado. Luego dividimos la cadena en elementos individuales y los almacenamos en la variable result_array.

Finalmente, usamos un bucle for para imprimir los elementos de la matriz.

En conclusión, devolver una matriz en bash puede ser complicado, ya que bash no admite matrices. Sin embargo, se puede usar un método conocido como sustitución de comandos para tener una función.

Esto implica encerrar la matriz entre comillas y usar echo para imprimirla y luego dividir la cadena resultante en elementos individuales usando la variable IFS.

Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

Artículo relacionado - Bash Array