2012-05-17 5 views
5

I持って、(この質問の目的のためにダウン易しく書き直さ)このような何か値の配列を反復処理するスクリプト:bash配列を繰り返し処理し、配列名を動的に置き換えることは可能ですか?

COUNTRIES=(ENGLAND SCOTLAND WALES) 

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

私の質問ですが、それは動的配列を置換することが可能ですか?たとえば、実行時に反復処理を行うために配列を渡すことができます。

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

+1、サンプルコードとエラーメッセージが含まれています。がんばろう。 – shellter

答えて

4

を取得しています、私は次のことを試してみたが、私は私の構文は

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

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

loopOverSomething $ANIMALS 

間違っているかもしれないと思います配列を引数として次のように指定します。

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

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

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

これはテストしましたか?それは確かに指定された通りにはうまく動作せず、件名のBashFAQエントリは、そのことがわからないことを示しています。 –

+0

私はそれをテストし、投稿したときにコピーペーストエラーが発生しました。今すぐ修正する必要があります。 –

0

使用することができます:私はあなたがこのためにはbashの間接的な拡張を使用することができますline 22: ${$2[@]}: bad substitution

+1

-1引用符を使用しない場合、 'countries =(" New Wales "England)'、 "New"、 "Wales"は別々のエントリとして扱われます。 –

+0

@CharlesDuffy申し訳ありませんが、あなたは正しいです。私はOPのコードをコピーしました。 – sgibb

0

これはBashFAQ #006

は、我々は(安全に行うことは極めて困難であるのevalを使用しての短い)、POSIXまたはBourneシェルでその機能を複製することができます任意のトリックに気づいていません。間接的な配列の仕掛けが機能していないものもあれば、そうでないものもありますが、将来のリリースでは構文が安定しているかどうかはわかりません。だから、これをあなた自身のリスクハックで使うことを考えてみましょう。うまく述べ集束問題の

# 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. 
関連する問題