eval数组值bash

时间:2014-02-25 23:46:38

标签: arrays bash eval

我正在尝试使用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

在尝试使用此语句来为数组[index_value]赋值时,我得到以下输出。

$ 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

是否有人就如何使其发挥作用提出建议?

谢谢!

1 个答案:

答案 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对该主题的详尽处理,包括可移植性讨论。