1

Мне нужно перебрать массив и расширить массив во время перебора. Как мне это сделать в BASH?

Например:

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

Я хочу получить следующий вывод:

a
b
c
d
e

Редактировать:

Следующий код работает на данный момент:

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 

1 ответ1

1

Он не работает с циклом for ... in "${arr[@]}" потому что "${arr[@]}" вычисляется немедленно. То есть, даже если вы добавите к нему элементы во время цикла, диапазон цикла уже определен и не будет затронут.

Вы можете переписать как подсчет for цикла:

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

Это работает, потому что ${#MODULES[@]} в условии цикла переоценивается в каждом цикле цикла. Таким образом, после добавления значения во время цикла, в начале следующего цикла значение ${#MODULES[@]} будет увеличено на 1.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .