迭代bash数组,动态替换数组名称,这可能吗?

时间:2012-05-17 14:33:00

标签: bash

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

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

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

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

loopOverSomething "${ANIMALS[@]}"
loopOverSomething "${COUNTRIES[@]}"

答案 2 :(得分: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.