1 votes

Comment étendre dynamiquement une boucle itérant sur un tableau en BASH ?

J'ai besoin d'itérer sur un tableau et de développer le tableau pendant l'itération. Comment puis-je le faire en BASH ?

Par exemple :

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

Je veux obtenir le résultat suivant :

a
b
c
d
e

Editar:

Le code suivant fonctionne pour l'instant :

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

1voto

janos Points 3017

Cela ne fonctionne pas avec un for ... in "${arr[@]}" boucle parce que "${arr[@]}" est évalué immédiatement. En d'autres termes, même si vous y ajoutez des éléments pendant la boucle, la portée de la boucle est déjà déterminée et ne sera pas affectée.

Vous pourriez réécrire comme un comptage for boucle :

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

Cela fonctionne parce que ${#MODULES[@]} dans la condition de la boucle est réévalué à chaque cycle de la boucle. Donc après qu'une valeur soit ajoutée pendant la boucle, alors au début du cycle suivant, la valeur de ${#MODULES[@]} sera augmenté de 1.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X