Bash は関数から連想配列を返し、その連想配列を別の関数に渡します。

Bash は関数から連想配列を返し、その連想配列を別の関数に渡します。

パラメータとして渡されたリストから関数の連想配列を作成しようとしても機能しません。

#!/usr/bin/env bash



function cwd {
  echo "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
}


function list_commands {
  local root="$1"
  local command_list="${*:2}"
  declare -A cmds
  for cmd in $command_list; do
    cmds["#{$cmd}"]+="$root/scripts/displays/$cmd.sh #{pane_current_path} #{pane_id}"
  done
  echo "$cmds"
}

PLUGIN_ROOT_DIR="$(cwd)"

declare -A cmds=$(list_commands "$PLUGIN_ROOT_DIR" "rbenv_ruby_ver githud")

main "$cmds"

どうすればいいのかわかりません。 bashスクリプトは私の利点ではありません(ただしますます良くなっていますが)。

これを行うにはどうすればよいですか?

これはtpm tmuxプラグインの一部としてtmuxで実行されることに注意してください。

答え1

文字列以外のデータ構造は、実際にはシェル関数間で渡すことはできません。ただし、名前参照を使用して、連想配列(または必要な他の変数)の名前を渡すことはできます。bashバージョン4.3以降、名前参照が可能です。

例:

foo () {
    declare -n aarr="$1"

    aarr["fookey"]=foovalue
}

declare -A myarray

myarray["mainkey"]=mainvalue
foo myarray

for key in "${!myarray[@]}"; do
    printf '%s = %s\n' "$key" "${myarray[$key]}"
done

bash参照変数名(aarr上記)は参照変数名(上記)と異なる必要があるという要件に注意してくださいmyarray

テスト:

$ bash script.sh
fookey = foovalue
mainkey = mainvalue

関連情報