我正在尝试使用eval替换数组名称和值,并使用无法正常工作的组合丢失我的想法
$ eval echo \$${port[$index]}${item[0]}${item[8]}
some_value
declare -a port=('Ex' 'backup' 'DRAC' 'Service');
declare -a item=('net' 'switch' 'port' 'speed' 'cvsswitch' 'vlan' 'link' 'count' 'list')
for x in $(eval echo \$${port[$index]}${item[0]}${item[8]}) ; do
eval ${port[$index]}${item[7]}=$[${port[$index]}${item[7]} +1] # incriment count
eval echo \$${port[$index]}${item[7]} # set count
eval \$"${port[$index]}${item[1]}"[\$${port[$index]}${item[7]}] <---- not working
done
fi
$ eval \$${port[$index]}${item[1]}[\$${port[$index]}${item[7]}]=abc123
-bash: [1]: command not found
or
$ eval \$${port[$index]}${item[1]}[\$${port[$index]}${item[7]}]=abc123
-bash: [1]=abc123: command not found
是否有人就如何使其发挥作用提出建议?
谢谢!
答案 0 :(得分:1)
您不需要eval,也不应该使用eval来进行此类作业。
declare -a port=('Ex' 'backup' 'DRAC' 'Service')
declare -a item=('net' 'switch' 'port' 'speed' 'cvsswitch' 'vlan' 'link' 'count' 'list')
index=3 # for example
array_name=${port[$index]}${item[1]}
array_idx=${port[$index]}${item[7]}
declare -A "$array_name" # since your index is non-numeric
printf -v "${array_name}[${array_idx}]" '%s' abc123
这会将Serviceswitch[Servicecount]
设置为abc123
。
无论如何,提前分配变量名称是更好的做法 - 当您可以查看构建它的部分时,可以更容易地诊断出失败的原因。
请参阅BashFAQ #6对该主题的详尽处理,包括可移植性讨论。