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} )
ワンクッションかツークッション、処理が多いような気もするので、よりエレガントな方法がありましたらどこかでつぶやいてください。
Posted by yujiro このページの先頭に戻る
- シェルスクリプトのexpectで応答メッセージを振り分ける方法
- bashでPostgreSQLのselect結果を出力する方法
- bashでbackspaceが動作しない場合の対処
- bashの変数から最後の1文字を取得・削除する方法
- bashのwhile文で利用した変数がループ外で反映されない場合の対処
- bashのechoでアスタリスク「*」がワイルドカードとして展開される場合の対処
- bashの正規表現でスペース(空白)を判定する方法
- bashで文字列の長さを調べる方法
- bashで数値を判定する方法
- bashで小数点を比較する方法
- bashの配列をjoinする方法
- bashのif文で正規表現を使用する方法
- Bashで変数を大文字または小文字に変換する方法
- bashの変数をsplitして配列を作る方法
- シェルスクリプトでtelnet接続する方法
トラックバックURL
コメントする
greeting