![Bash 从函数返回关联数组,然后将该关联数组传递给其他函数](https://linux22.com/image/138537/Bash%20%E4%BB%8E%E5%87%BD%E6%95%B0%E8%BF%94%E5%9B%9E%E5%85%B3%E8%81%94%E6%95%B0%E7%BB%84%EF%BC%8C%E7%84%B6%E5%90%8E%E5%B0%86%E8%AF%A5%E5%85%B3%E8%81%94%E6%95%B0%E7%BB%84%E4%BC%A0%E9%80%92%E7%BB%99%E5%85%B6%E4%BB%96%E5%87%BD%E6%95%B0.png)
我正在尝试通过参数传入的列表在函数中构建关联数组,但它不起作用:
#!/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