## INI functions [@bashly-upgrade ini] ## This file is a part of Bashly standard library ## ## Usage: ## ## - In your script, call ‘ini_load path/to/config.ini`. ## - A global associative array named `ini` will become available to you, ## - When updating any of the associative array’s values, call ## ‘ini_save path/to/config.ini` to save the data. ## - INI sections are optional. ## ## Get a value: ## ## ${ini} # for keys under a [section] ## ${ini} # for keys not under a [section] ## ${ini:-default} # get a default value if the INI key is unset ## ## Update/create a value: ## ## ini=“value” ## ini_save path/to/config.ini ## ## Delete a value ## ## unset ini ## ini_save path/to/config.ini ## ## Load an INI file and populate the associative array `ini`. ini_load() {
unset ini
declare -gA ini
local ini_file="$1"
local section=""
local key=""
local value=""
local section_regex="^\[(.+)\]"
local key_regex="^([^ =]+) *= *(.*) *$"
local comment_regex="^;"
while IFS= read -r line; do
if [[ $line =~ $comment_regex ]]; then
continue
elif [[ $line =~ $section_regex ]]; then
section="${BASH_REMATCH[1]}."
elif [[ $line =~ $key_regex ]]; then
key="${BASH_REMATCH[1]}"
value="${BASH_REMATCH[2]}"
[[ $value == *\$* ]] && value=$(envsubst <<<"$value")
ini["${section}${key}"]="$value"
fi
done <"$ini_file"
}
## Save the associative array ‘ini` back to a file ini_save() {
declare -gA ini
local ini_file="$1"
local current_section=""
local has_free_keys=false
rm -f "$ini_file"
for key in $(ini_keys); do
[[ $key == *.* ]] && continue
has_free_keys=true
value="${ini[$key]}"
echo "$key = $value" >>"$ini_file"
done
[[ "${has_free_keys}" == "true" ]] && echo >>"$ini_file"
for key in $(ini_keys); do
[[ $key == *.* ]] || continue
value="${ini[$key]}"
IFS="." read -r section_name key_name <<<"$key"
if [[ "$current_section" != "$section_name" ]]; then
[[ $current_section ]] && echo >>"$ini_file"
echo "[$section_name]" >>"$ini_file"
current_section="$section_name"
fi
echo "$key_name = $value" >>"$ini_file"
done
}
## Show all loaded key-value pairs ini_show() {
declare -gA ini
for key in $(ini_keys); do
echo "$key = ${ini[$key]}"
done
}
## Get an array of all keys: ## ## for key in $(ini_keys); do ## echo “- $key = ${ini}”; ## done ## ini_keys() {
declare -gA ini
local keys=("${!ini[@]}")
for a in "${keys[@]}"; do echo "$a"; done | sort
}