#!/bin/bash # ------------------------------------------------------------------------------ # Variables substitution function # This file is part of the init.sh project # Copyright (c) 2019-2024 Geoffray Levasseur # ------------------------------------------------------------------------------ # 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 ;; *) 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 ...] " die 1 fi if [[ ${#vars[@]} -eq 0 ]]; then prnt E "No variable name(s) provided." die 1 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 1 } 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