从变量读取时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
相关产品推荐
相关产品推荐

