本を読む

読書やコンピュータなどに関するメモ

bashで関数に配列を渡す

 Twitterで「bashの配列って本当の配列じゃなくて、空白で区切られた文字列の並びじゃないか」という意味のツイートを見かけました。位置パラメータのことかなと思って前後のツイートを見たら、配列をシェル関数に引数で渡すときの話のようでした。

 それは配列のデータ構造のせいではなくて、関数呼び出しのインターフェイスがコマンドライン形式(Cでいうとargcとargv)に決められてるのが原因だと一瞬思いましたが、いずれにせよ使う側には同じ話だと思い直しました。

 自分だったらシェル関数に配列を渡す必要があるときはどうするかというと、たぶん変数の動的スコープを使うと思います。

$ cat a1.bash
#!/bin/bash

bar() {
    echo ${ary[1]}
}

foo() {
    declare ary=("a b" "c d")
    bar
}

foo
$ bash a1.bash
c d

 ただ、呼び出し元と呼び出し先で暗黙に変数名を決めうちしているのがキレイではないですね。これはbash 4.3だとnameref(名前参照)を使う手があります。変数名を渡してるだけなので、名前の衝突には無力ですが。

$ cat a2.bash
#!/bin/bash

bar() {
    declare -n a=$1
    echo ${a[1]}
}

foo() {
    declare ary=("a b" "c d")
    bar ary
}

foo
$ bash a2.bash
c d

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/1223-3452189b

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad