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