这有点复杂。我有一个配置文件。它看起来像这样。
customer="airtel"
model_name=fast
programmer_typ_of="dev"
现在第一列包含所有键,后面的内容就是=
每个键的值。它就像这样的格式:
key=value
如何编写一个函数,它将调用这样的文件并将每个键和值存储到两个单独的数组中,其中每个数组的相同位置将包含相应的键和值。请注意,我无法在函数中的任何地方使用我的密钥名称,也无法使用确切的密钥名称进行 grep。或者,我想到了一种解决此问题的方法,即通过将行号分配给配置文件,并基于grep
在循环中使用来查找各个行号来“剪切”每个键和值对。像这样的东西:
function parse() {
i=0
declare -a arr1
declare -a arr2
cat -n model.conf #assigns row numbers to model.conf
while true; do
var1=$(cat model.conf | grep ^$i | cut -d '=' -f1) #gets the key and stores it in variable var1
var2=$(cat model.conf | grep ^$i | cut -d '=' -f2) #gets the value and stores it in variable var2
arr1[$i]=$var1 #array containing keys
arr2[$i]=$var2 #array containing values
i=$(( $i + 1 ))
done
}
如果您能告诉我这个函数有什么问题,或者您是否可以建议一些其他方法来获取不同数组中的单独键值对。
答案1
使用 awk:
eval $(awk -F= -v i=0 '{print "arr1["i"]="$1";arr2["i"]="$2;i++}' model.conf)
使用=
作为字段分隔符和i
具有初始值的变量0
,awk
将打印"arr1["i"]="$1";arr2["i"]="$2
每一行,其中$1
将具有键,并且将具有每行的$1
值和增量。i
awk -F= -v i=0 '{print "arr1["i"]="$1";arr2["i"]="$2;i++}' model.conf
输出:
arr1[0]=customer;arr2[0]="airtel"
arr1[1]=model_name;arr2[1]=fast
arr1[3]=programmer_typ_of;arr2[3]="dev"
然后使用eval
awk 输出来分配数组。
答案2
您可以使用 bash shell 的内置read
函数直接解析它,将字段分隔符设置为=
while IFS== read -r name value; do
arr1+=("$name")
arr2+=("$value")
done < model.conf
默认情况下,数组的索引为零,即
$ echo "${arr1[0]}"
customer
$ echo "${arr2[0]}"
"airtel"
由于变量(包括数组)具有全局作用域,除非显式声明为local
,因此如果您愿意,可以将解析循环放在函数中。为了显示:
#!/bin/bash
function parse() {
while IFS== read -r name value; do
arr1+=("$name")
arr2+=("$value")
done < model.conf
}
# call the function to extract key=value pairs from file to arrays
parse
# now we can use the arrays e.g.
for i in "${!arr1[@]}"; do
printf 'key: %s\tvalue: %s\n' "${arr1[$i]}" "${arr2[$i]}"
done
结果
key: customer value: "airtel"
key: model_name value: fast
key: programmer_typ_of value: "dev"