需要在Bash中将局部变量加载到关联数组中

需要在Bash中将局部变量加载到关联数组中,bash,associative-array,local-variables,Bash,Associative Array,Local Variables,我正在构建一个配置脚本,将变量(在bash文件中集中定义)填充到各种非bash文件(sql、nginx等)中,作为虚拟机加速的一部分 我需要的是构建一个用局部变量填充的关联数组 例如: #!/usr/bin/env bash var1=abc var2=123 var3=xyz declare -A vars_list #magic script would produce this: vars_list=([var1]=$var1 [var2]=$var2 [var3]=$var3) #p

我正在构建一个配置脚本,将变量(在bash文件中集中定义)填充到各种非bash文件(sql、nginx等)中,作为虚拟机加速的一部分

我需要的是构建一个用局部变量填充的关联数组

例如:

#!/usr/bin/env bash
var1=abc
var2=123
var3=xyz
declare -A vars_list

#magic script would produce this:
vars_list=([var1]=$var1 [var2]=$var2 [var3]=$var3)

#print out
for i in "${!vars_list[@]}"
do
  echo "key  : $i"
  echo "value: ${vars_list[$i]}"
done
将产生:

键:var1
值:abc
键:var3
值:xyz
键:var2
值:123

我已经试了很久了。这似乎是bash无法简单做到的另一件事。帮助?

你可以用这种方法试试

var1=abc
var2=123
var3=xyz
declare -A vars_list

#magic script would produce this:
vars_index=('var1' 'var2' 'var3')
for ((i=0;i<${#vars_index[@]};i++))
do
    vars_list["${vars_index[i]}"]="${!vars_index[i]}"
done

#print out
for i in "${!vars_list[@]}"
do
    echo "key  : $i"
    echo "value : ${vars_list[$i]}"
done
var1=abc
var2=123
var3=xyz
声明-变量列表
#魔术脚本将产生以下效果:
变量索引=('var1''var2''var3')
对于((i=0;i

胜过

declare -A vars_list
vars_list=(
    [var1]=abc
    [var2]=123
    [var3]=xyz
)
?只需直接分配给关联数组。

declare-A vars
declare -A vars
while IFS= read -r var; do
  vars[$var]=${!var}
done < <(compgen -v)
而IFS=read-r var;do 变量[$var]=${!var}
完成<您看到了吗?bash的哪个版本(
bash--version
)?为什么需要它?变量名从何而来?@jeremysprofile您引用的是关联数组吗?这里的主要问题是动态提取所有局部变量,而不是手动提取。不确定这是否是您引用的。Bash版本为4。2@choroba,我需要它,因为我正在尝试设置构建中的所有变量一个地方的脚本。构建脚本(bash)获取这些env变量并将它们放入sql构建文件、nginx文件和其他可能的域中—这些域在bash中没有直接接口。从技术上讲,我可以将它们全部嵌入bash中,但这会非常混乱,我就是不这样做。有没有理由不提前运行
set-a
来导出这些变量这将启用一些更简单的技术(例如,
而IFS==read-r-d''key val;do array[$key]=$val;done<谢谢,这肯定是其中的一半。然而,困难的部分是动态获取局部变量列表(换句话说,没有vars_索引的帮助)。我尝试了几种不同的方法,包括“declare”、“printenv”、“set”和“env”,但它们似乎都没有一种干净的途径来获得我所需要的。这看起来很有希望,但我无法让它毫无错误地运行。我不熟悉“<我在寻找动态构建,而不是手动构建。请参阅Charles Duffy的回答。我认为这是最好的方法。您对BASHPID、OPTIND或LS_颜色等var感兴趣吗?
declare -A vars
while IFS= read -r var; do
  vars[$var]=${!var}
done < <(compgen -v)