【问题标题】:Store values from arrays in config-file to variables将值从配置文件中的数组存储到变量
【发布时间】:2014-10-28 23:43:10
【问题描述】:

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

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 

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

【问题讨论】:

  • 不能再添加一个for循环吗?
  • 可能会有 50 个或更多的数组。我真的不想在我的代码中放置 50 个 for 循环。
  • 或许值得在这里提供更多上下文。你到底想达到什么目的?为什么还要像这样单独创建变量?

标签: arrays linux bash


【解决方案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

如果您只是使用另一个数组作为想要的值,那会更简单一些。那么讨厌的eval 也可以避免。

【讨论】:

  • 注意 - Triplee 使用上面建议的嵌套循环(关闭循环)
  • 最后我没有使用循环 - 只是 set/sed 组合,这对我来说很好用
  • @PaulBastide 这很简单。实质在于获取数组名称,以及间接使用它们的诡计。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多