Bashは関数から配列を直接返すことをサポートしていません。しかし、巧妙なテクニックを使うことで実現できます。この記事では、コマンド置換と内部フィールドセパレータ(IFS)を操作する2つの効果的な方法を解説します。
目次
コマンド置換
コマンド置換は、コマンドの出力を取得して変数に代入します。これが最初の方法の基礎となります。ポイントは、関数の出力を配列に簡単に解析できるようにフォーマットすることです。
コマンド置換による配列の返却
この方法は、デリミタを使って配列要素を文字列に結合し、その文字列を再び配列に分割します。例を見てみましょう。
my_array_function() {
local array=("apple" "banana" "cherry")
local delimiter="|"
echo "${array[*]}" | tr ' ' 'n' | paste -sd"$delimiter" -
}
returned_string=$(my_array_function)
returned_array=(${returned_string//|$delimiter/ })
echo "Returned array: ${returned_array[@]}"
動作は次のとおりです。
my_array_function
はローカル配列を作成します。echo
、tr
を使ってスペースを改行に置き換え、paste
を使ってデリミタで要素を結合します。- コマンド置換によって出力が
returned_string
に取得されます。 - パラメータ展開によってデリミタをスペースに置き換え、配列
returned_array
を作成します。
この方法はシンプルで効果的ですが、デリミタは配列要素に含まれていてはなりません。含まれる場合は、あまり使用されない文字や、より堅牢なデリミタ処理方法を使用することを検討してください。
IFSによる配列の返却
内部フィールドセパレータ(IFS)は、Bashが文字列を単語に分割する方法を制御します。関数内でIFSを設定し、配列要素を出力することで、配列を返すことができます。呼び出し側のスクリプトは、変更されたIFSを使用して出力を解析します。
my_array_function() {
local array=("apple" "banana" "cherry")
local old_ifs="$IFS"
IFS=$'n'
printf "%sn" "${array[@]}"
IFS="$old_ifs"
}
returned_array=($(my_array_function))
echo "Returned array: ${returned_array[@]}"
説明:
my_array_function
は現在のIFSを保存します。- IFSを改行文字に設定します。
- 各配列要素を改行で出力します。
- IFSを復元します。
- 呼び出し側のスクリプトは、改行をセパレータとして配列を作成します。
配列要素に改行が含まれていない場合、この方法はよりクリーンです。改行を含む要素の場合は、より可能性の低い別のIFS文字を選択する必要があります。
最適な方法の選択
どちらの方法も実行可能な解決策を提供します。最適な選択は、特定のニーズと配列の内容によって異なります。コマンド置換アプローチはデリミタの選択において柔軟性が高く、IFSを使用する方法はデータが許容する場合はよりクリーンです。常にクリーンで、堅牢で、よくコメントされたコードを優先してください。