## Config functions [@bashly-upgrade config] ## This file is a part of Bashly
standard library ## ## Usage: ## - In your script, set the CONFIG_FILE variable. For rxample: ## CONFIG_FILE=settings.ini. ## If it is unset, it will default to ‘config.ini’. ## - Use any of the functions below to access the config file. ## ## Create a new config file. ## There is normally no need to use this function, it is used by other ## functions as needed. ## config_init() {
CONFIG_FILE=${CONFIG_FILE:=config.ini} [[ -f "$CONFIG_FILE" ]] || touch "$CONFIG_FILE"
}
## Get a value from the config. ## Usage: result=$(config_get hello) config_get() {
local key=$1 local regex="^$key *= *(.+)$" local value="" config_init while IFS= read -r line || [ -n "$line" ]; do if [[ $line =~ $regex ]]; then value="${BASH_REMATCH[1]}" break fi done <"$CONFIG_FILE" echo "$value"
}
## Add or update a key=value pair in the config. ## Usage: config_set key value config_set() {
local key=$1 shift local value="$*" config_init local regex="^($key) *= *.+$" local output="" local found_key="" local newline while IFS= read -r line || [ -n "$line" ]; do newline=$line if [[ $line =~ $regex ]]; then found_key="${BASH_REMATCH[1]}" newline="$key = $value" output="$output$newline\n" elif [[ $line ]]; then output="$output$line\n" fi done <"$CONFIG_FILE" if [[ -z $found_key ]]; then output="$output$key = $value\n" fi printf "%b\n" "$output" >"$CONFIG_FILE"
}
## Delete a key from the config. ## Usage: config_del key config_del() {
local key=$1 local regex="^($key) *=" local output="" config_init while IFS= read -r line || [ -n "$line" ]; do if [[ $line ]] && [[ ! $line =~ $regex ]]; then output="$output$line\n" fi done <"$CONFIG_FILE" printf "%b\n" "$output" >"$CONFIG_FILE"
}
## Show the config file config_show() {
config_init cat "$CONFIG_FILE"
}
## Return an array of the keys in the config file. ## Usage: ## ## for k in $(config_keys); do ## echo “- $k = $(config_get ”$k“)”; ## done ## config_keys() {
local regex="^([a-zA-Z0-9_\-\/\.]+) *=" config_init local keys=() local key while IFS= read -r line || [ -n "$line" ]; do if [[ $line =~ $regex ]]; then key="${BASH_REMATCH[1]}" keys+=("$key") fi done <"$CONFIG_FILE" echo "${keys[@]}"
}
## Returns true if the specified key exists in the config file. ## Usage: ## ## if config_has_key “key”; then ## echo “key exists” ## fi ## config_has_key() {
[[ $(config_get "$1") ]]
}