编辑:

编辑:

我需要迭代一个数组并在迭代过程中扩展该数组。如何在 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

它不适用于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。

相关内容