我有以下bash函数,用于加载INI文件并将其解析为两个数组,一个用于键,另一个用于值,然后使用这些数组编写一个新的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我遇到的问题是有时候我得到了一些空洞的价值
config.ini
key_01=value_01
key_02=value_02
key_03=
key_04=value_04
key_05=value_05所以我最后得到了一个“newconfig.ini”
key_01=value_01
key_02=value_02
key_03=value_04
key_04=value_05
key_05=如何解决这个问题以保留数组中和新编写的INI文件中的空值?
发布于 2022-11-19 17:18:06
ini_values=($(awk -F‘*= *’/^/ {print $2}‘“$1))
您在这里依赖于分词,这确实会删除空字段,但是如果您的任何值都有空格,也会导致问题;它们会被分割成多个字段。而glob字符可能扩展为文件名。在这里有些讨论:为什么我的外壳脚本会被空格或其他特殊字符阻塞?
另外,为每个输入行运行一个或两个awk实例是相当高的开销。
幸运的是,shell的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]}"
donehttps://unix.stackexchange.com/questions/725547
复制相似问题