Bash 배열에서 INI 파일을 구문 분석하고 다시 작성합니다.

Bash 배열에서 INI 파일을 구문 분석하고 다시 작성합니다.

INI 파일을 로드하고 이를 키용과 값용의 두 배열로 구문 분석하는 bash 함수가 있습니다. 그런 다음 이 배열을 사용하여 새 INI 파일을 작성합니다.

declare -a ini_keys
declare -a ini_values

load_settings() {
    echo "Loading settings from \"$1\""
    ini_keys=()
    ini_values=()
    if [ -f "$1" ]; then
        ini_keys=($(awk -F ' *= *' '/^[a-z]/ {print $1}' "$1"))
        ini_values=($(awk -F ' *= *' '/^[a-z]/ {print $2}' "$1"))
        return 0
    fi
    echo "Missing \"$1\""
    return 1
}

save_settings() {
    echo "Saving settings to \"$1\""
    [ -f "$1" ] && mv "$1" "$1.bak"
    for index in "${!ini_keys[@]}"; do
        echo "${ini_keys[$index]}=${ini_values[$index]}" >> "$1"
    done
}

load_settings config.ini
save_settings new-config.ini

내가 가진 문제는 때때로 일부 null 값이 발생한다는 것입니다.

구성 파일

key_01=value_01
key_02=value_02
key_03=
key_04=value_04
key_05=value_05

그래서 나는 다음과 같은 "new-config.ini"로 끝납니다.

key_01=value_01
key_02=value_02
key_03=value_04
key_04=value_05
key_05=

배열과 새로 작성된 INI 파일에서 null 값을 유지하려면 이 문제를 어떻게 해결해야 합니까?

답변1

ini_values=($(awk -F ' *= *' '/^[a-z]/ {print $2}' "$1"))

여기서는 빈 필드를 제거하는 단어 분할을 사용하고 있지만 값에 공백이 있으면 여러 필드로 분할되어 문제가 발생합니다. 그리고 전역 문자를 파일 이름으로 확장할 수 있습니다. 여기서 조금 논의해 보겠습니다.공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?

또한 awk각 입력 행에 대해 하나 또는 두 개의 인스턴스를 실행하는 오버헤드가 상당히 높습니다.

다행스럽게도 쉘의 read내장 함수는 입력을 분할할 수 =있으므로 다음과 같은 작업을 수행할 수 있습니다. 연관 배열은 키-값 관계를 직접적으로 나타낼 수 있기 때문에 여기에서 사용됩니다. 그러나 정말로 원한다면 일반 배열을 사용할 수 있습니다.

#!/bin/bash

configfile=config.ini
declare -A config

# read the ini file in
while IFS== read -r key val; do
    config+=(["$key"]="$val")
done < "$configfile"

# print and change one value
k=key_05
echo "key $k -> value ${config[$k]}"
config[$k]="foo bar"

# print it all out
for key in "${!config[@]}"; do
    printf "%s=%s\n" "$key" "${config[$key]}"
done

관련 정보