108 lines
3.0 KiB
Bash
108 lines
3.0 KiB
Bash
#!/bin/bash
|
|
# ------------------------------------------------------------------------------
|
|
# Variables substitution function
|
|
# This file is part of the init.sh project
|
|
# Copyright (c) 2019-2024 Geoffray Levasseur <fatalerrors@geoffray-levasseur.org>
|
|
# ------------------------------------------------------------------------------
|
|
# This file is distributed under 3-clause BSD license.
|
|
# The complete license agreement can be obtained at:
|
|
# https://opensource.org/licenses/BSD-3-Clause
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Replace @VAR@ in a text file by the corresponding $VAR value
|
|
# The --delimiter or -d option allow to use something else than @
|
|
setvar()
|
|
{
|
|
local delimiter="@"
|
|
local vars=()
|
|
local file
|
|
|
|
# Parse arguments
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--delimiter|-d)
|
|
shift
|
|
delimiter="${1:-@}"
|
|
;;
|
|
-*)
|
|
prnt E "setvar(): Unknown option: $1"
|
|
die 7
|
|
;;
|
|
*)
|
|
if [[ -f $1 && $# -eq 1 ]]; then
|
|
file="$1"
|
|
else
|
|
vars+=("$1")
|
|
fi
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if [[ -z $file ]]; then
|
|
prnt E "Usage: setvar [--delimiter D] VAR1 [VAR2 ...] <file>"
|
|
die 7
|
|
fi
|
|
if [[ ${#vars[@]} -eq 0 ]]; then
|
|
prnt E "No variable name(s) provided."
|
|
die 7
|
|
fi
|
|
|
|
local var val escaped pattern
|
|
for var in "${vars[@]}"; do
|
|
val="${!var}"
|
|
if [[ -z $val ]]; then
|
|
prnt W "Variable '$var' is unset or empty; skipped."
|
|
continue
|
|
fi
|
|
|
|
# Échapper les caractères spéciaux pour sed
|
|
escaped=$(printf '%s' "$val" | sed -e 's/[\/&]/\\&/g')
|
|
|
|
pattern="${delimiter}${var}${delimiter}"
|
|
|
|
prnt I "Replacing $pattern with $val in $file"
|
|
sed -i -e "s|$pattern|$escaped|g" "$file"
|
|
done
|
|
}
|
|
export -f setvar
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Replace @VAR@ in a text file by the corresponding values available in the
|
|
# environment. The --delimiter or -d option allow to use something else than @
|
|
setvars_from_env()
|
|
{
|
|
local file delimiter="@"
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
-d|--delimiter)
|
|
shift
|
|
delimiter="${1:-@}"
|
|
;;
|
|
*)
|
|
file="$1"
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
[[ -f $file ]] || {
|
|
prnt E "File not found: $file"
|
|
die 10
|
|
}
|
|
|
|
local vars
|
|
vars=$(grep -o "${delimiter}[A-Z0-9_]\+${delimiter}" "$file" | sort -u | tr -d "$delimiter")
|
|
[[ -z $vars ]] && return 0
|
|
|
|
setvar --delimiter "$delimiter" $vars "$file"
|
|
}
|
|
export -f setvars_from_env
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
|
# EOF |