我遇到了以下问题: 我有一个带有多个数组的配置文件(用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
我想,这适用于一个特定的数组。但是,我怎么能告诉脚本分析配置文件中的每个数组呢? 谢谢你的帮助!
答案 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
。