我需要为包含以下内容的文件中的每个“部分”创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的例子。