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.)