首页 > 解决方案 > for循环的动态开始

问题描述

使用两个替代开始创建 bash for 循环。我想根据条件遍历范围内的所有数字或数组中的所有元素。以下非正统代码显示了示例:

#!/bin/bash
FROMVAL=1
TOVAL=5
VALARR=(1 3 5)
ISCONSEQ=1
if (( ISCONSEQ == 1 )); then
        for (( counter=$FROMVAL; counter<=$TOVAL; counter++ ))
else
        for counter in "${VALARR[@]}"
fi
        do
                echo $counter
        done

显然,这不起作用,也不是很漂亮。有没有一种 bash 方法可以做到这一点,或者我应该创建两个 for 循环并根据内容只执行一个ISCONSEQ?或者我应该for...in对这两种情况都使用一个循环,然后简单地将我的序列值分配给数组?

此代码确实有效,但仅依赖于数组:

if (( ISCONSEQ == 1 )); then
        VALARR=($(seq $FROMVAL 1 $TOVAL))
fi
for counter in "${VALARR[@]}"
do
        echo $counter
done

标签: bashfor-loopconditional-statements

解决方案


这是一个很好的函数用例。为 echo 创建函数并从每个 for 循环中调用它。它看起来像这样。

#!/bin/bash
FROMVAL=1
TOVAL=5
VALARR=(1 3 5)
ISCONSEQ=1

function dostuff() {
   echo $*
}

if (( ISCONSEQ == 1 )); then
        for (( counter=$FROMVAL; counter<=$TOVAL; counter++ ))
        do
            dostuff $counter
        done
else
        for counter in "${VALARR[@]}"
        do
                dostuff $counter
        done
fi

推荐阅读