bashで引数に配列を設定する方法

bashで引数に配列を設定する方法

Posted at September 13,2013 2:55 AM
Tag:[bash]

bashで引数に配列を設定する方法を紹介します。

bashで引数に配列を設定する方法

1.問題点

bashでは配列を引数として渡すことができません。

たとえば、次のように配列を関数fooのパラメータに渡すことはできません。

function foo() {
    local list=$1
    for i in "${list[@]}"; do
        echo "${i}"
    done
}
 
hoge=( 'xxx' 'yyy' 'zzz' )
foo ${hoge[@]}

2.引数に配列を設定する

配列を設定することはできないので、配列の名前を引数で渡し、関数側では間接参照を使います。

function foo() {
    local arrayname=$1
    eval ref=\"\${$arrayname[@]}\"
    local list=( ${ref} )
    for i in "${list}"; do
        echo "${i}"
    done
}
 
hoge=( 'xxx' 'yyy' 'zzz' )
foo hoge

まず、関数起動のときには配列の名前だけを渡します。

foo list

呼び出された関数fooでは、配列の名前を変数に保持します。

local arrayname=$1

evalを用いて、変数に保持した値を変数名として、さらにその値を取得します。

eval ref=\"\${$arrayname[@]}\"

上記のコードは、evalで変数部分($arrayname)が評価されて、

ref="${hoge[@]}"

となります。

これで変数refに「xxx yyy zzz」という値が設定されるので、これを関数側の配列として定義します。

local list=( ${ref} )

ワンクッションかツークッション、処理が多いような気もするので、よりエレガントな方法がありましたらどこかでつぶやいてください。

関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)