これは少し複雑です。構成ファイルがあります。こんな感じです。
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
$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"
次に、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"