1. ホーム

[解決済み】bashでパラメータとして配列を渡す。

2022-04-11 14:42:21

質問

bashの関数にパラメータとして配列を渡すにはどうしたらいいですか?

注意してください。 Stack Overflowで答えが見つからなかったので、自分で多少雑な解決策を投稿してみました。これは、1つの配列だけを渡すことができ、それはパラメータリストの最後の要素になります。実際には、配列を渡すのではなく、その要素のリストを渡しています。 called_function() しかし、私の場合はうまくいきました。もし、もっと良い方法を知っている人がいたら、遠慮なくここに追加してください。

解決方法は?

を渡すことができます。 引数として複数の配列 のような使い方をします。

takes_ary_as_arg()
{
    declare -a argAry1=("${!1}")
    echo "${argAry1[@]}"

    declare -a argAry2=("${!2}")
    echo "${argAry2[@]}"
}
try_with_local_arys()
{
    # array variables could have local scope
    local descTable=(
        "sli4-iread"
        "sli4-iwrite"
        "sli3-iread"
        "sli3-iwrite"
    )
    local optsTable=(
        "--msix  --iread"
        "--msix  --iwrite"
        "--msi   --iread"
        "--msi   --iwrite"
    )
    takes_ary_as_arg descTable[@] optsTable[@]
}
try_with_local_arys

が表示されます。

sli4-iread sli4-iwrite sli3-iread sli3-iwrite  
--msix  --iread --msix  --iwrite --msi   --iread --msi   --iwrite

編集・注釈 (以下コメントより)

  • descTableoptsTable は名前として渡され、関数内で展開される。したがって $ をパラメータとして与える必要があります。
  • なお、これは descTable などが定義されています。 local なぜなら、ローカルは呼び出した関数から見えるからです。
  • は、その !${!1} は、arg 1変数を展開します。
  • declare -a は、インデックス付き配列を明示的にするだけで、厳密には必要ではありません。