Molte delle risposte utilizzando evaleecho tipo di lavoro, ma si interrompono su varie cose, come più righe, tentativi di sfuggire ai meta-caratteri della shell, fughe all'interno del modello non destinato ad essere espanso da bash, ecc.
Ho avuto lo stesso problema e ho scritto questa funzione di shell, che per quanto posso dire, gestisce tutto correttamente. Questo rimuoverà ancora solo le nuove righe finali dal modello, a causa delle regole di sostituzione dei comandi di bash, ma non ho mai scoperto che sia un problema finché tutto il resto rimane intatto.
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"
}
Ad esempio, puoi usarlo in questo modo con uno parameters.cfgscript di shell che imposta solo le variabili e template.txtun modello che utilizza tali variabili:
. parameters.cfg
printf "%s\n" "$(apply_shell_expansion template.txt)" > result.txt
In pratica, lo uso come una sorta di sistema di template leggero.
evalla sicurezza di .