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

これはBashFAQ #006でカバーされています:

POSIX または Bourne シェルでその機能を複製できるトリックは認識していません (安全に実行するのが非常に困難な 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 に答える
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 に答える