Ich weiß, dass dieses Thema alt ist, aber ich habe eine einfachere Arbeitslösung, ohne die Variablen zu exportieren. Kann ein Einzeiler sein, aber ich trenne lieber mit \ am Zeilenende.
var1='myVar1'\
var2=2\
var3=${var1}\
envsubst '$var1,$var3' < "source.txt" > "destination.txt"
# ^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^
# define which to replace input output
Die Variablen müssen in derselben Zeile wie envsubst definiert werden ist als Umgebungsvariable zu berücksichtigen.
Die '$var1,$var3' ist optional, nur die angegebenen zu ersetzen. Stellen Sie sich eine Eingabedatei vor, die ${VARIABLE_USED_BY_JENKINS} enthält die nicht ersetzt werden sollten.
In Bezug auf Antwort 2 haben Sie bei der Erörterung von envsubst gefragt:
Wie kann ich es mit den in meinem .sh-Skript deklarierten Variablen zum Laufen bringen?
Die Antwort ist, dass Sie einfach Ihre Variablen exportieren müssen, bevor Sie envsubst aufrufen .
Sie können auch die Variablenzeichenfolgen, die Sie ersetzen möchten, in der Eingabe mit envsubst einschränken SHELL_FORMAT -Argument (um das unbeabsichtigte Ersetzen einer Zeichenfolge in der Eingabe durch einen gemeinsamen Shell-Variablenwert zu vermeiden - z. B. $HOME ).
Zum Beispiel:
export VAR1='somevalue' VAR2='someothervalue'
MYVARS='$VAR1:$VAR2'
envsubst "$MYVARS" <source.txt >destination.txt
Ersetzt alle Instanzen von $VAR1 und $VAR2 (und nur VAR1 und VAR2 ) in source.txt mit 'somevalue' und 'someothervalue' bzw..
Es stellt sich heraus, dass auf meinem System ein envsubst vorhanden ist Befehl, der Teil des Pakets gettext-base ist.
So wird es einfach:
envsubst < "source.txt" > "destination.txt"
Beachten Sie, wenn Sie dieselbe Datei für beide verwenden möchten, müssen Sie so etwas wie sponge von moreutil verwenden , wie von Johnny Utahh vorgeschlagen:envsubst < "source.txt" | sponge "source.txt" . (Weil die Shell-Weiterleitung sonst die Datei vor dem Lesen leert.)