Bash 从一个函数返回一个关联数组,然后将该关联数组传递给其他函数

The*_*tix 4 shell associative-array bash-functions

我正在尝试从通过 arg 传入的列表中的函数中构建关联数组,但它不起作用:

#!/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"
Run Code Online (Sandbox Code Playgroud)

我不知道该怎么做,bash 脚本不是我的强项(虽然我在这方面做得越来越好)

我该怎么做才能完成这项工作?

请记住,这将作为 tpm tmux 插件的一部分在 tmux 中执行。

Kus*_*nda 8

除了字符串之外的数据结构不能真正在 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
Run Code Online (Sandbox Code Playgroud)

请注意,bash要求名称引用变量的名称(aarr上)与被引用变量的名称(myarray上)不同。

测试:

$ bash script.sh
fookey = foovalue
mainkey = mainvalue
Run Code Online (Sandbox Code Playgroud)