You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从变量读取时Bash复合关联数组赋值失败问题求助

Bash关联数组赋值失败的原因与解决方法

我搞不懂为啥Bash不接受这种关联数组赋值操作。一开始以为是子shell里赋值的变量父进程识别不了,但试了进程替换< <(...)也没用。

问题场景

compound=$(lvs --noheadings --units m --nosuffix -o name,size vg_oracle|cut -d. -f1|awk '{printf"[%s]=%d ",$1,$2}')

echo $compound
[lv_home_oracle]=20480 [lv_home_oracle_app]=40960 [lv_home_oracle_swdepot]=40960 [lv_opt_crs]=40960

unset oralvs; declare -A oralvs

oralvs=($compound)
-bash: oralvs: $compound: must use subscript when assigning associative array

echo ${!oralvs[*]}

直接赋值的对比

但直接把数组键值对写死赋值却完全正常,没看出语法有问题:

oralvs=([lv_home_oracle]=20480 [lv_home_oracle_app]=40960 [lv_home_oracle_swdepot]=40960 [lv_opt_crs]=40960)

echo ${!oralvs[*]}
lv_home_oracle_app lv_opt_crs lv_home_oracle_swdepot lv_home_oracle

echo ${oralvs[*]}
40960 40960 40960 20480

我本来想通过变量或命令替换实现复合键值对的数组赋值。

解决方法

用eval配合双引号包裹declare语句就能解决这个问题,实际测试有效:

unset oralvs

echo ${!oralvs[*]}

eval "declare -A oralvs=($compound)"

echo ${!oralvs[*]}
lv_home_oracle_app lv_opt_crs lv_home_oracle_swdepot lv_home_oracle

echo ${oralvs[*]}
40960 40960 40960 20480

内容的提问来源于stack exchange,提问作者ragro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 11:24:59