Bash从configuration文件parsing数组

我需要为包含以下内容的文件中的每个“部分”创build一个数组

[array0] value1=asdf value2=jkl [array1] value1=1234 value2=5678 

我想能够像这样检索这些值:

 echo ${array0[value1]} echo ${array0[value2]} echo ${array1[value1]} echo ${array1[value2]} 

任何想法如何做到这一点? (解释将是一个奖金)

我已经阅读过这些漫画,但没有一个是我想要做的。

在BASH中读取configuration文件而不使用“source”

BASH从configuration文件parsingvariables

数组像bash(configuration文件)中的数据结构?

用bash v4,使用关联数组,将配置文件中的属性存储为实际的bash变量:

 $ while read line; do if [[ $line =~ ^"["(.+)"]"$ ]]; then arrname=${BASH_REMATCH[1]} declare -A $arrname elif [[ $line =~ ^([_[:alpha:]][_[:alnum:]]*)"="(.*) ]]; then declare ${arrname}[${BASH_REMATCH[1]}]="${BASH_REMATCH[2]}" fi done < config.conf $ echo ${array0[value1]} asdf $ echo ${array1[value2]} 5678 $ for i in "${!array0[@]}"; do echo "$i => ${array0[$i]}"; done value1 => asdf value2 => jkl $ for i in "${!array1[@]}"; do echo "$i => ${array1[$i]}"; done value1 => 1234 value2 => 5678 

一个eval free,100%纯Bash的可能性:

 #!/bin/bash die() { printf >&2 "%s\n" "$@" exit 1 } aryname='' linenb=0 while read line; do ((++linenb)) if [[ $line =~ ^[[:space:]]*$ ]]; then continue elif [[ $line =~ ^\[([[:alpha:]][[:alnum:]]*)\]$ ]]; then aryname=${BASH_REMATCH[1]} declare -A $aryname elif [[ $line =~ ^([^=]+)=(.*)$ ]]; then [[ -n aryname ]] || die "*** Error line $linenb: no array name defined" printf -v ${aryname}["${BASH_REMATCH[1]}"] "%s" "${BASH_REMATCH[2]}" else die "*** Error line $linenb: $line" fi done 

读取标准输入。 如果你想从一个文件中读取,改变done

 done < "filename" 

表格的行

 space and funnŷ sÿmbòl=value that will have an equal sign: look = it's funny 

被允许

你可以用bash脚本声明数组

declare -a <array_name>=(value1 value2 value 3)

那么你可以像这样使用它们

echo ${<array_name>[index]}

编辑:

好的,从配置文件构造数组。 我会建议有一个不同的文件,你想创建每个数组。

所以这里是步骤

1.配置文件 (创建一个文件,并将其中的值)

 100
 200
 300

2.script文件 (从文件读取值并准备一个数组)

    阵列=()

     #setup数组
    而IFS = $'\ n'读-a配置
    做
      阵列+ =($ {配置})
    完成<file_name

     #access值
     echo $ {array [0]}
     echo $ {array [1]}

IFS表示分隔符
-a指定要提取的数组名称,以便您可以在while循环内访问它们。

我即将出门,但是我认为你可以做这样的事情(未经测试),也许像@anubhava这样聪明的人会把它捡起来并完成它。

 eval $(gawk -F= '/^\[/{name=gensub(/\[|\]/,"","g");x=0} /=/{print "name[",x++,"]=",$2," "}' config) 

基本上,当它看到一个以“ [ ”开头的行时,它会在变量name选择数组名称,并用gensub()方括号。 然后,当它看到一个带有“ = ”的行时,它会输出数组名称和一个递增的索引“ x ”,以便eval可以拿起。

得到破折号 – 在这里看看stats的例子。