Bash Scripting

Bash関数からの効率的な配列の返却

Spread the love

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[@]}"

動作は次のとおりです。

  1. my_array_functionはローカル配列を作成します。
  2. echotrを使ってスペースを改行に置き換え、pasteを使ってデリミタで要素を結合します。
  3. コマンド置換によって出力がreturned_stringに取得されます。
  4. パラメータ展開によってデリミタをスペースに置き換え、配列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[@]}"

説明:

  1. my_array_functionは現在のIFSを保存します。
  2. IFSを改行文字に設定します。
  3. 各配列要素を改行で出力します。
  4. IFSを復元します。
  5. 呼び出し側のスクリプトは、改行をセパレータとして配列を作成します。

配列要素に改行が含まれていない場合、この方法はよりクリーンです。改行を含む要素の場合は、より可能性の低い別のIFS文字を選択する必要があります。

最適な方法の選択

どちらの方法も実行可能な解決策を提供します。最適な選択は、特定のニーズと配列の内容によって異なります。コマンド置換アプローチはデリミタの選択において柔軟性が高く、IFSを使用する方法はデータが許容する場合はよりクリーンです。常にクリーンで、堅牢で、よくコメントされたコードを優先してください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です