2011-11-10 13 views
12

配列を関数に渡すにはどうすればよいのでしょうか? 他の質問の解決策は私にとっては役に立たなかった。 レコードについては、配列をコピーする必要はありませんので、参照を渡しても構いません。私がしたいのは、それをループすることだけです。配列をbash関数に渡す方法

$ ar=(a b c) 
$ function test() { echo ${1[@]}; } 
$ echo ${ar[@]} 
a b c 
$ test $ar 
bash: ${1[@]}: bad substitution 
$ test ${ar[@]} 
bash: ${1[@]}: bad substitution 

答えて

11
#!/bin/bash 
ar=(a b c) 
test() { 
    local ref=$1[@] 
    echo ${!ref} 
} 

test ar 
+0

さて、動作 "1つの$ VAR 2" エコーありません$ {!ref}の中で; は を行う "1 $ PKG 2" を}エコー行う AR =(ABC) テスト配列内のスペースに対して脆弱になります "$ {!REF}" 'あるいはループ内のPKG用 – johndir

+1

使用' AR要素(例えば、 'ar =(a" bc "d"))。 –

+0

@glenn jackman:seconded – ata

2

arテストするための最初のパラメータではありません - それはすべてのパラメータです。あなたの機能にはecho "[email protected]"が必要です。

+0

まあ、これは私が最初に意図したものではありませんが、それはトリックんでした:例えば、上記使用しての「$ @」でVARのために テスト(){ を。 PKGのための試験(){ ローカルREF = $ 1 [@] : は、AR =(ABC) } は を行っ[@] AR 試験$ {} – johndir

5

私はこの質問には、ほぼ2歳実現するが、それは上記の回答のどれも実際に(@ataと@のl0b0の答え)を行わない元の質問に対する実際の答えを考え出すの方に助けてくれました。問題は "配列をbash関数に渡すにはどうすればいいですか?"ですが、@ataはそれに近づきましたが、メソッド自体は関数自体の中で実際に使用する配列で終わるわけではありません。 1つのマイナーな追加が必要です。

だから、我々は機能do_something_with_array()を呼び出す前にどこかanArray=(a b c d)を持っていたと仮定すると、これは、我々は関数を定義する方法を次のとおりです。今

function do_something_with_array { 
    local tmp=$1[@] 
    local arrArg=(${!tmp}) 

    echo ${#arrArg[*]} 
    echo ${arrArg[3]} 
} 

do_something_with_array anArray 

だろ正しく出力:

4 
d 

あなたのarのいくつかの要素がある可能性がある場合rayがスペースを含む場合は、IFSをSPACE以外の値に設定してから、関数の配列argをローカル配列にコピーした後に戻ってください。

local tmp=$1[@] 
prevIFS=$IFS 
IFS=, 
local arrArg=(${!tmp}) 
IFS=$prevIFS 
関連する問題