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