将值分配给动态数组

时间:2013-12-07 20:24:43

标签: arrays bash shell dynamic

我的bash脚本需要从属性文件中读取值并将它们分配给多个数组。阵列的数量也通过配置来控制。我目前的代码如下:

limit=$(sed '/^\#/d' $propertiesFile | grep 'limit'  | tail -n 1 | cut -d "=" -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
for (( i = 1 ; i <= $limit ; i++ ))
do
   #properties that define values to be assigned to the arrays are labeled myprop## (e.g. myprop01, myprop02):
   lookupProperty=myprop$(printf "%.2d" "$i")
   #the following line reads the value of the lookupProperty, which is a set of space-delimited strings, and assigns it to the myArray# (myArray1, myArray2, etc):
   myArray$i=($(sed '/^\#/d' $propertiesFile | grep $lookupProperty  | tail -n 1 | cut -d "=" -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'))
done

当我尝试执行上述代码时,会显示以下错误消息:

syntax error near unexpected token `$(sed '/^\#/d' $propertiesFile | grep $lookupProperty  | tail -n 1 | cut -d "=" -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')'

我很确定问题在于我宣布“myArray $ i”数组的方式。但是,我尝试过的任何不同方法都会产生相同的错误或不完整的结果。

有任何想法/建议吗?

1 个答案:

答案 0 :(得分:2)

你是对的,bash不会将构造myArray$i=(some array values)识别为数组变量赋值。一个解决方法是:

read -a myArray$i <<<"a b c"

read -a varname命令从stdin读取一个数组,该数组由“here”字符串<<<"a b c",提供,并将其分配给varname,其中varname可以构造为myArray $ i。因此,在您的情况下,命令可能如下所示:

read -a myArray$i <<<"$(sed '/^\#/d' $propertiesFile | grep$lookupProperty  | tail -n 1 | cut -d "=" -f2- | seds/^[[:space:]]*//;s/[[:space:]]*$//')"  

以上允许分配。下一个问题是如何读出像myArray $ i这样的变量。一种解决方案是间接地将变量命名为:

var="myArray$i[2]" ; echo ${!var}