이것은 약간 복잡합니다. 구성 파일이 있습니다. 이렇게 생겼습니다.
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"
그런 다음 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"