将配置文件中的数组值存储到变量中

时间:2014-10-28 11:14:22

标签: arrays linux bash

我遇到了以下问题: 我有一个带有多个数组的配置文件(用bash编写),这些数组的数量不同于config到config。每个数组包含三个值。

declare -a array0
array0=(value1 value2 value3)  
#  
declare -a array1  
array1=(value1 value2 value3)  
#  
declare -a array2  
array2=(value1 value2 value3)      

现在,此配置文件来自主bash脚本。我想从数组到数组并将值存储到单个变量中。我的实际解决方案:

for ((i=0;i=2;i++))  
do  
 if [ "$i" = 0 ]  
 then  
  wantedvalue1="${array0["$i"]}"  
 fi  
 if [ "$i" = 1 ]  
 then  
  wantedvalue2="${array0["$i"]}"  
 fi  
 if [ "$i" = 2 ]  
 then  
  wantedvalue3="${array0["$i"]}"  
 fi  
done 

我想,这适用于一个特定的数组。但是,我怎么能告诉脚本分析配置文件中的每个数组呢? 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

您可以通过set在您的环境中找到阵列。这将提取具有三个元素的数组的名称:

set | sed -n 's/^\([_A_Za-z][_A-Za-z0-9]*\)=(\[0]=.*\[2]="[^"]*")$/\1/p'

(反斜杠的数量取决于你的sed方言。这对Debian来说很有用,其中反斜杠括号是用于分组的元字符,并且字面上匹配的是圆括号。)

我真的不明白你为什么要使用循环来提取三个元素,但wacky indirect reference syntax in bash强迫它在这里。

for array in $(set |
  sed -n 's/^\([_A_Za-z][_A-Za-z0-9]*\)=(\[0]=.*\[2]="[^"]*")$/\1/p'); do
    for((i=0, j=1; i<3; ++i, ++j)); do
         k="$array[$i]"
         eval wantedvalue$j=\'${!k}\'
    done
    :
    : code which uses the wantedvalues here
done

如果您只是使用另一个数组作为wantvalues,那将会更简单。然后也可以避免讨厌的eval