如何在bash中创建具有动态名称的数组

时间:2018-12-12 15:35:06

标签: bash

示例

我想知道每种安排的大小。 我有一个多维的安排。

array=("SRV_1=(e1 e2 e3 e4)" "SRV_2=(e1 e2)")

for elt in "${array[@]}";do eval $elt;done

CANT_SRVS="${#array[@]}

for ((i=1;i<=$CANT_SRVS;i++));do
  CANT_E="${#SRV_$i[@]}"    <------ ERROR
  echo $CANT_E          <------- length array
done

2 个答案:

答案 0 :(得分:4)

nameref可以指向多个变量;因此,srvVar会引用您下面的多个数组中的任何一个:

srv_1=(e1 e2 e3 e4)            # I don't condone the original "eval" pattern, and no part of
srv_2=(e1 e2)                  # the question hinged on it; thus, not reproducing it here.

declare -n curSrv
for curSrv in "${!srv_@}"; do  # iterates over variable names starting with "srv_"
  echo "${#curSrv[@]}"         # ...taking the length of each.
done

请参见https://ideone.com/Js28eQ

答案 1 :(得分:0)

查尔斯有很好的建议。

代码上的切线:当变量分配保存在变量中时,可以使用eval代替declare

value="SRV_1=(e1 e2 e3 e4)"
declare -a "$value"
varname=${value%%=*}
declare -p "$varname"
declare -a SRV_1='([0]="e1" [1]="e2" [2]="e3" [3]="e4")'

而且,如查尔斯所演示的那样,使用数组declare -n a=$varname

进行工作的名称引用。