使用循环解析并将行号分配给文件

使用循环解析并将行号分配给文件

这有点复杂。我有一个配置文件。它看起来像这样。

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具有初始值的变量0awk将打印"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"

然后使用evalawk 输出来分配数组。

答案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"

相关内容