GNU/Linux >> Tutoriales Linux >  >> Linux

Bash Matriz de matrices?

Intento escribir un bucle anidado y no sé cómo escribirlo. Tal vez estoy mirando en la dirección equivocada, pero lo que intento escribir es:

declare -a bar=("alpha" "bravo" "charlie")
declare -a foo=("delta" "echo" "foxtrot" "golf")

declare -a subgroups=("bar" "foo")

Entonces me gustaría iterar los subgrupos (en el futuro más bar s y foo s vendrán), y dentro de ellos itérelos ya que pueden tener una cantidad diferente de elementos.

La salida deseada sería algo como:

group name: bar with group members: alpha bravo charlie
        working on alpha of the bar group
        working on bravo of the bar group
        working on charlie of the bar group
group name: foo with group members: delta echo foxtrot golf
        working on delta of the foo group
        working on echo of the foo group
        working on foxtrot of the foo group
        working on golf of the foo group

El código de cierre que he escrito parece fallar en la barra y fu matrices y su expansión con los elementos de cada conjunto.

for group in "${subgroups[@]}"; do
   lst=${!group}
   echo "group name: ${group} with group members: ${!lst[@]}"
   for element in "${!lst[@]}"; do
       echo -en "\tworking on $element of the $group group\n"
   done
done

Y la salida es:

group name: bar with group members: 0
        working on 0 of the bar group
group name: foo with group members: 0
        working on 0 of the foo group

Respuesta aceptada:

Este es un problema bastante común en bash , para hacer referencia a una matriz dentro de matrices para las que necesita crear referencias de nombre con declare -n . El nombre que sigue a -n actuará como una referencia de nombre para el valor asignado (después de = ). Ahora tratamos esta variable con el atributo nameref para expandirla como si fuera una matriz y hacer una expansión de matriz entrecomillada adecuada como antes.

for group in "${subgroups[@]}"; do
    declare -n lst="$group"
    echo "group name: ${group} with group members: ${lst[@]}"
    for element in "${lst[@]}"; do
        echo -en "\tworking on $element of the $group group\n"
    done
done

Tenga en cuenta que bash solo admite referencias de nombre de v4.3 en adelante. Para versiones anteriores y otras soluciones, consulte Asignación de variables indirectas/de referencia

Relacionado:¿Cómo usar bash como shell predeterminado?
Linux
  1. ¿Cómo crear una matriz de elementos únicos a partir de una cadena/matriz en Bash?

  2. Obtener todos los archivos excepto los archivos en matriz:¿Bash?

  3. Matrices bash con ejemplos

  4. El último tutorial de Bash Array con 15 ejemplos

  5. Matriz en Bash no encontrada

Arreglos bash

Matriz asociativa en Bash

Bash Scripting:matriz asociativa explicada con ejemplos

Bash Beginner Series #4:Uso de arreglos en Bash

Cómo agotar el tiempo de espera de un grupo de comandos en Bash

cómo cambiar el valor de la matriz en bash