Bash Parse Arrays from configuration file

I need to have an array for each "section" in a file containing:

[array0]
value1=asdf
value2=jkl

[array1]
value1=1234
value2=5678

I want to get these values ​​as follows:

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

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

Any thoughts on how to do this? (Explanations will be a bonus)

I already read these underders, but nobody does exactly what I want to do.

Read configuration file in BASH without using "source"

BASH Parsing variables from a configuration file

Array as data structure in BASH (configuration file)?

+4
source share
4 answers

with bash v4, using associative arrays, save the properties from the configuration file as actual bash variables:

$ 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
+6

eval -, 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 funny

+2

bash

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

echo ${<array_name>[index]}

Edit:

, . , .

,

1.config ( )

100
200
300

2.script ( )

    array=()

    #setup array
    while IFS=$'\n' read -a config
    do
      array+=(${config})
    done < file_name

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

IFS
-a , , while.

0

, , - (), , , - , @anubhava, ...

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

, , "[", name gensub(). , "=" , "x" eval .

Gotta dash - stat -s .

0
source

Source: https://habr.com/ru/post/1537178/


All Articles