5

我有一个迭代值数组的脚本,就像这样(为了这个问题的目的而简化):

COUNTRIES=( ENGLAND SCOTLAND WALES )

for i in ${COUNTRIES[@]}
do                  
    echo "Country is $i "
done

我的问题是,是否可以动态替换数组?例如,我希望能够传入数组以在运行时进行迭代。我尝试了以下方法,但我认为我的语法可能是错误的

COUNTRIES=( ENGLAND SCOTLAND WALES )
ANIMALS=( COW SHEEP DOG )

loopOverSomething()
{
    for i in ${$1[@]}
    do                  
        echo "value is $i "
    done
}

loopOverSomething $ANIMALS

我越来越line 22: ${$2[@]}: bad substitution

4

3 回答 3

4

您可以为此使用 bash 的间接扩展:

loopOverSomething()
{
    looparray="$1[@]"
    for i in "${!looparray}"
    do
        echo "value is $i"
    done
}
于 2012-05-17T15:16:09.493 回答
0

您可以通过以下方式将数组用作参数:

COUNTRIES=( ENGLAND SCOTLAND "NEW WALES" )
ANIMALS=( COW SHEEP DOG )

loopOverSomething()
{
    for i in "$@"
    do                  
        echo "value is $i "
    done
}

loopOverSomething "${ANIMALS[@]}"
loopOverSomething "${COUNTRIES[@]}"
于 2012-05-17T15:18:38.230 回答
0

BashFAQ #006涵盖了这一点:

我们不知道有任何技巧可以在 POSIX 或 Bourne shell 中复制该功能(没有使用 eval,这很难安全地完成)。Bash 几乎可以做到——一些间接数组技巧有效,而另一些则无效,而且我们不知道所涉及的语法在未来的版本中是否会保持稳定。因此,请考虑这是一种使用风险自负的黑客攻击。

# Bash -- trick #1.  Seems to work in bash 2 and up.
realarray=(...) ref=realarray; index=2
tmp="$ref[$index]"
echo "${!tmp}"            # gives array element [2]

# Bash -- trick #2.  Seems to work in bash 3 and up.
# Does NOT work in bash 2.05b.
tmp="$ref[@]"
printf "<%s> " "${!tmp}"; echo    # Iterate whole array.
于 2012-05-17T15:42:42.670 回答