从变量读取时,Bash 中的复合关联数组变量赋值失败

问题描述 投票:0回答:1

我很抱歉问了这么一个微不足道的问题,这个问题可能已经在这里得到了十几次的回答。 但我无法理解到底是什么原因阻碍了 Bash 心满意足地接受这项任务。 我假设可能对分叉父级中分配给子 shell 子级的变量内容有某种不了解? 但我通过

< <(command_that_parses_value_to_be_assigned)
进行进程替换的尝试仍然徒劳。

这就是我困惑的地方。

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

感谢您的关注和耐心。

期望从变量读取数组的复合键值分配 或者命令替换就可以了。

附注我认为Bash:从变量设置关联数组回答了我的问题。 对我来说最容易理解的答案是用双引号括起来的 eval 语句,这似乎对我有用。 例如

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

arrays bash variable-assignment associative
1个回答
0
投票

[...]=...
是数组赋值的syntax 的一部分;它必须在参数扩展发生之前存在并被识别。就像你不能用 equals==; x${equals}3 来代替
x=3
一样,你也不能构造这样的动态数组赋值(无论如何,没有
eval
)。
    

© www.soinside.com 2019 - 2024. All rights reserved.