So che questo argomento è vecchio, ma ho una soluzione di lavoro più semplice senza esportare le variabili. Può essere un oneliner, ma preferisco dividere usando \ a fine riga.
var1='myVar1'\
var2=2\
var3=${var1}\
envsubst '$var1,$var3' < "source.txt" > "destination.txt"
# ^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^
# define which to replace input output
Le variabili devono essere definite sulla stessa riga di envsubst è da considerare come variabili d'ambiente.
Il '$var1,$var3' è facoltativo per sostituire solo quelli specificati. Immagina un file di input contenente ${VARIABLE_USED_BY_JENKINS} che non dovrebbe essere sostituito.
In riferimento alla risposta 2, discutendo di envsubst, hai chiesto:
Come posso farlo funzionare con le variabili dichiarate nel mio script .sh?
La risposta è che devi semplicemente esportare le tue variabili prima di chiamare envsubst .
Puoi anche limitare le stringhe di variabili che vuoi sostituire nell'input usando envsubst SHELL_FORMAT argomento (evitando la sostituzione involontaria di una stringa nell'input con un valore di variabile di shell comune, ad esempio $HOME ).
Ad esempio:
export VAR1='somevalue' VAR2='someothervalue'
MYVARS='$VAR1:$VAR2'
envsubst "$MYVARS" <source.txt >destination.txt
Sostituirà tutte le istanze di $VAR1 e $VAR2 (e solo VAR1 e VAR2 ) in source.txt con 'somevalue' e 'someothervalue' rispettivamente.
Guardando, risulta che sul mio sistema c'è un envsubst comando che fa parte del pacchetto gettext-base.
Quindi, questo lo rende facile:
envsubst < "source.txt" > "destination.txt"
Nota se vuoi usare lo stesso file per entrambi, dovrai usare qualcosa come sponge di moreutil , come suggerito da Johnny Utahh:envsubst < "source.txt" | sponge "source.txt" . (Perché altrimenti il reindirizzamento della shell svuoterà il file prima della sua lettura.)