ループを使用してファイルに行番号を解析して割り当てます。

ループを使用してファイルに行番号を解析して割り当てます。

これは少し複雑です。構成ファイルがあります。こんな感じです。

customer="airtel"
model_name=fast
programmer_typ_of="dev"

最初の列にはすべてのキーが含まれ、次の内容は=各キーの値です。次の形式です。

key=value

このようなファイルを呼び出し、各キーと値を2つの別々の配列に格納する関数をどのように書くことができますか?各配列の同じ位置に対応するキーと値が含まれます。関数のどこでも私のキー名を使用できず、正確なキー名で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$1i

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"

次に、awk出力を使用してeval配列を割り当てます。

答え2

bashシェルの組み込みread関数を使用して、フィールド区切り文字を次のように設定して直接解析できます。=

while IFS== read -r name value; do 
  arr1+=("$name")
  arr2+=("$value") 
done < model.conf

デフォルトでは、配列のインデックスは0です。

$ 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"

関連情報