我有一个脚本迭代一组值,就像这样(为了这个问题的目的而愚蠢):
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
答案 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)
我们不知道任何可以在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.