De nombreuses réponses utilisant eval
etecho
type de travail, mais interrompent sur diverses choses, telles que plusieurs lignes, la tentative d'échapper aux méta-caractères du shell, les échappements à l'intérieur du modèle qui ne sont pas destinés à être développés par bash, etc.
J'ai eu le même problème et j'ai écrit cette fonction shell qui, pour autant que je sache, gère tout correctement. Cela supprimera toujours uniquement les nouvelles lignes de fin du modèle, à cause des règles de substitution de commande de bash, mais je n'ai jamais trouvé que cela posait problème tant que tout le reste reste intact.
apply_shell_expansion() {
declare file="$1"
declare data=$(< "$file")
declare delimiter="__apply_shell_expansion_delimiter__"
declare command="cat <<$delimiter"$'\n'"$data"$'\n'"$delimiter"
eval "$command"
}
Par exemple, vous pouvez l'utiliser comme ceci avec un parameters.cfg
qui est en fait un script shell qui ne fait que définir des variables, et un template.txt
qui est un modèle qui utilise ces variables:
. parameters.cfg
printf "%s\n" "$(apply_shell_expansion template.txt)" > result.txt
En pratique, je l'utilise comme une sorte de système de gabarit léger.
eval
.