Preciso iterar em uma matriz e expandir a matriz enquanto iterativo. Como faço isso em BASH?
Por exemplo:
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
Eu quero obter a seguinte saída:
a
b
c
d
e
Editar:
Seguir o código funciona por agora:
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
Respostas:
Não funciona com um
for ... in "${arr[@]}"
loop porque"${arr[@]}"
é avaliado imediatamente. Ou seja, mesmo que você adicione elementos a ele durante o loop, o intervalo do loop já está determinado e não será afetado.Você poderia reescrever como uma contagem
for
loop:Isso funciona porque
${#MODULES[@]}
na condição de loop é reavaliado em cada ciclo de loop. Então, depois que um valor é anexado durante o loop, em seguida, no início do próximo ciclo, o valor de${#MODULES[@]}
será aumentado em 1.fonte