¿Cómo expandir un bucle iterando sobre una matriz dinámicamente en BASH?

1

Necesito iterar en una matriz y expandir la matriz mientras itero. ¿Cómo lo hago en BASH?

Por ejemplo:

req="a b c d"
read -a MODULES <<<$req

for MODULE_NAME in "${MODULES[@]}"; do
    echo $MODULE_NAME
    if something-happens-only-one-time; then 
        MODULES+=( "e" )
    fi
done

Quiero obtener el siguiente resultado:

a
b
c
d
e

Editar:

El siguiente código funciona por ahora:

i=0
while true; do
    MODULE_NAME="${MODULES[$i]}"
    echo ${MODULE_NAME}

    if something-happens-only-one-time; then 
        MODULES+=( "e" )
    fi

    i=$((i+1))
    num_of_modules=${#MODULES[@]}
    if (("$i" >= "$num_of_modules")) ; then 
        break
    fi
done 
ceremcem
fuente
Puede canalizar la matriz para ordenar y luego uniq -u. Saldrá cualquier miembro que aparezca solo una vez. Ver stackoverflow.com/questions/618378/…
Argonauts

Respuestas:

1

No funciona con un for ... in "${arr[@]}" bucle porque "${arr[@]}" Se evalúa de inmediato. Es decir, aunque le agregue elementos durante el ciclo, el rango del ciclo ya está determinado y no se verá afectado.

Podrías reescribir como una cuenta for lazo:

for ((i = 0; i < "${#MODULES[@]}"; i++)); do
    MODULE_NAME=${MODULES[$i]}
    echo $MODULE_NAME
    if something-happens-only-one-time; then 
        MODULES+=( "e" )
    fi
done

Esto funciona porque ${#MODULES[@]} en la condición de bucle se reevalúa en cada ciclo de bucle. Así que después de que se agrega un valor durante el bucle, Luego, al comienzo del siguiente ciclo, el valor de ${#MODULES[@]} se incrementará en 1.

janos
fuente
El siguiente código no funciona gist.github.com/ceremcem/2f399afef92332bcd5d7b778a1da302d
ceremcem
1
@ceremcem has cometido algunos errores allí. Aquí está la solución: gist.github.com/janosgyerik/fa5e4b2c342123f9f18d022a02f1ca47
janos
¡Oh, sí, mi error! :)) gracias :))
ceremcem