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

除字符串之外的数据结构不能真正在 shell 函数之间传递。但是,您可以使用名称引用来传递关联数组(或您可能想要的任何其他变量)的名称。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

相关内容