루프를 사용하여 파일에 줄 번호를 구문 분석하고 할당합니다.

루프를 사용하여 파일에 줄 번호를 구문 분석하고 할당합니다.

이것은 약간 복잡합니다. 구성 파일이 있습니다. 이렇게 생겼습니다.

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

관련 정보