2017-01-19 13 views
3

私は、変数を引用する方法がわからないBashスクリプトを持っています。 助けがあれば幸いです。配列をBash関数に渡すには?

このコードは完璧に動作します:

myfunction() { 
    for i in "${BASE_ARRAY[@]}" 
    do 

私は他の配列とそれを再利用することができるように関数に変数としての私の配列の名前を渡したいです。これは私がそれが失敗しようとしているコードです:

myfunction() { 
    for i in "${$1[@]}" 
    do 

その後、私は関数に次を渡す:"${!VARIABLE_CONTAINING_NAME_TO_EXPAND}のようなバッシュルックで

myfunction() { 
    local x="$1[@]" 
    for i in "${!x}" 
    do 

間接参照:

myfunction BASE_ARRAY 
+0

複製物のように見えます:http://stackoverflow.com/questions/1063347/passing-arrays-as-parameters-in-bash – codeforester

答えて

4

はこれを試してみてください配列ではない変数の場合は簡単です。

しかし、y配列内の項目(またはあなたの場合のようなすべての項目)にアクセスする必要がある場合は、変数全体に参照を入れて展開する必要があります。

+0

'$ 1 [@]'は何に展開されますか?それは私には意味がありません。位置パラメータは '$ @'であり、 '$ 1'で指定された配列の配列要素を見たいと思ったら、それを'評価する '必要があるようです。 – Graham

+0

$ 1(最初の位置指定引数)にARRAY_NAMEが含まれているとします。 $ 1 [@]はARRAY_NAME [@]に展開されます。配列要素の実際の検索を実行するのは$ {!x}のステップです。 – Fred

+1

'local x =" $ {1} [@] "'として書く方が分かりやすいかもしれません(元のコードは完全に同等ですが)。 –

6

の配列をに渡すことは決して成功しませんでした。

私にとって、2つのオプションは、常にの内容を関数に渡すか、(bash 4.3以降で)参照を使ってアクセスされる配列名を渡します。次の例を考えてみましょう。

生成
#!/usr/bin/env bash 

myfunc() { 
     local -n arr=$1 
     printf '%s\n' "${arr[1]}" 
     arr[1]=HELLO 
} 

a=(one two three) 

myfunc a 
printf '%s\n' "${a[1]}" 

$ ./sample 
two 
HELLO 

注それは元のコンテンツへのアレイのローカルコピー、むしろローカルポインタを提供しないという点でlocal -nのようなdeclare -nであること。この例では、$arr[]を変更すると、元の配列$a[]が実際に変更されています。

配列の内容を関数に渡す伝統的な方法は、ここでStackOverflowで何度も述べられていますが、これはほとんど言及されていません。あなたは例を見つけるのに苦労することはありません。

+0

これは素晴らしいです。私は今まで知らなかった。私の脳を再び広げてくれてありがとう。 – Graham

+1

これは非常にうれしくて、私はエキサイティングなことを言っています(少なくともシェルの構文と同じくらい)。しかしそれはまた非常に新しいです。私は完全にパッチを当てたCenOS 7システムを持っており、bashはまだ4.2.26になっています。ランダムに配置されたスクリプトで広く使用されているスクリプトで使用するには、良い状態を待たなければならないのではないかと心配しています。 – Fred

+0

これはFredの答えと本当に似ています。 -nをローカル変数に追加すると、何か利点はありますか?それは速いですか?私が正しく理解していれば、-nを使うと関数内から実際の配列を変更できますか? – tjohnson