Je sais que ce sujet est ancien, mais j'ai une solution de travail plus simple sans exporter les variables. Peut être un oneliner, mais je préfère diviser en utilisant \
en fin de ligne.
var1='myVar1'\
var2=2\
var3=${var1}\
envsubst '$var1,$var3' < "source.txt" > "destination.txt"
# ^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^
# define which to replace input output
Les variables doivent être définies sur la même ligne que envsubst
est d'être considéré comme des variables d'environnement.
Le '$var1,$var3'
est facultatif pour ne remplacer que ceux spécifiés. Imaginez un fichier d'entrée contenant ${VARIABLE_USED_BY_JENKINS}
qui ne doit pas être remplacé.
En référence à la réponse 2, lors de la discussion envsubst, vous avez demandé :
Comment puis-je le faire fonctionner avec les variables déclarées dans mon script .sh ?
La réponse est que vous avez simplement besoin d'exporter vos variables avant d'appeler envsubst
.
Vous pouvez également limiter les chaînes de variables que vous souhaitez remplacer dans l'entrée en utilisant le envsubst
SHELL_FORMAT
argument (évitant le remplacement involontaire d'une chaîne dans l'entrée par une valeur de variable shell commune - par exemple $HOME
).
Par exemple :
export VAR1='somevalue' VAR2='someothervalue'
MYVARS='$VAR1:$VAR2'
envsubst "$MYVARS" <source.txt >destination.txt
Remplacera toutes les instances de $VAR1
et $VAR2
(et seulement VAR1
et VAR2
) en source.txt
avec 'somevalue'
et 'someothervalue'
respectivement.
En regardant, il s'avère que sur mon système il y a un envsubst
commande qui fait partie du package gettext-base.
Alors, c'est plus facile :
envsubst < "source.txt" > "destination.txt"
Notez que si vous souhaitez utiliser le même fichier pour les deux, vous devrez utiliser quelque chose comme sponge
de moreutil , comme suggéré par Johnny Utahh :envsubst < "source.txt" | sponge "source.txt"
. (Parce que la redirection du shell videra autrement le fichier avant sa lecture.)