Ersetzen Sie nur bestimmte Variablen durch envsubst


53

Ich versuche, das Ersetzen von Umgebungsvariablen durchzuführen envsubst, möchte jedoch nur bestimmte Variablen ersetzen.

Aus den Dokumenten sollte ich in der Lage sein, envsubstnur bestimmte Variablen zu ersetzen, aber ich bin nicht in der Lage, das zu tun.

Wenn ich zum Beispiel eine Datei habe, die Folgendes enthält:

VAR_1=${VAR_1}
VAR_2=${VAR_2}

wie soll ich das ausführen envsubstdamit es nur den verweis auf ersetzt ${VAR_1}?

Antworten:



130

Per Manpage:

envsubst [OPTION] [SHELL-FORMAT]

Wenn ein SHELL-FORMAT angegeben ist, werden nur die Umgebungsvariablen ersetzt, auf die in SHELL-FORMAT verwiesen wird. Andernfalls werden alle in der Standardeingabe vorkommenden Umgebungsvariablenverweise ersetzt.

Wobei SHELL-FORMAT-Zeichenfolgen "Zeichenfolgen mit Verweisen auf Shell-Variablen in der Form $variableoder ${variable}[...] Die Variablennamen dürfen nur aus alphanumerischen Zeichen oder ASCII-Zeichen mit Unterstrich bestehen, nicht mit einer Ziffer beginnen und nicht leer sein; ignoriert. " .
Man muss also die jeweiligen Variablennamen envsubstin einer Shell-Format-Zeichenfolge übergeben (offensichtlich müssen sie mit Escape-Zeichen versehen sein, um wörtlich an übergeben zu werden envsubst). Beispiel:

Eingabedatei zB infile:

VAR1=${VAR1}
VAR2=${VAR2}
VAR3=${VAR3}

und einige Werte wie

export  VAR1="one" VAR2="two" VAR3="three"

dann rennen

envsubst '${VAR1} ${VAR3}' <infile

oder

envsubst '${VAR1},${VAR3}' <infile

oder

envsubst '${VAR1}
${VAR3}' <infile

Ausgänge

VAR1=one
VAR2=${VAR2}
VAR3=three

Oder, wenn Sie Backslash bevorzugen:

envsubst \$VAR1,\$VAR2 <infile

produziert

VAR1=one
VAR2=two
VAR3=${VAR3}

13
Warum ist das nicht die akzeptierte Antwort?
Qsiris

3
Ja das ist die richtige Antwort!
Thomas Decaux

3
Wenn Sie ein Variablenpräfix kennen, mit dem Sie die zu ersetzenden Variablen einschränken können:envsubst "$(printf '${%s} ' ${!PREFIX*})" < infile
Sam Liddicott,

Oder wenn Sie eine Liste von ihnen SUBST_VARSdann haben:envsubst "$(printf '${%s} ' $SUBST_VARS)" < infile
Sam Liddicott
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.