I’m trying to perform environment variable replacement through envsubst, but I want to only replace specific variables.
From the docs I should be able to tell envsubst to only replace certain variables but I’m failing to be able to do that.
For example, if I have a file containing:
VAR_1=${VAR_1}
VAR_2=${VAR_2}
how should I execute envsubst so that it only replaces the reference to ${VAR_1}?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Per the man page:
envsubst [OPTION] [SHELL-FORMAT]
If a SHELL-FORMAT is given, only those environment variables that
are referenced in SHELL-FORMAT are substituted; otherwise all
environment variables references occurring in standard input are
substituted.
Where SHELL-FORMAT strings are “strings with references to shell variables in the form $variable or ${variable}[…] The variable names must consist solely of alphanumeric or underscore ASCII characters, not start with a digit and be nonempty; otherwise such a variable reference is ignored.”.
So, one has to pass the respective variables names to envsubst in a shell format string (obviously, they need to be escaped/quoted so as to be passed literally to envsubst). Example:
input file e.g. infile:
VAR1=${VAR1}
VAR2=${VAR2}
VAR3=${VAR3}
and some values like
export VAR1="one" VAR2="two" VAR3="three"
then running
envsubst '${VAR1} ${VAR3}' <infile
or
envsubst '${VAR1},${VAR3}' <infile
or
envsubst '${VAR1}
${VAR3}' <infile
outputs
VAR1=one
VAR2=${VAR2}
VAR3=three
Or, if you prefer backslash:
envsubst $VAR1,$VAR2 <infile
produces
VAR1=one
VAR2=two
VAR3=${VAR3}
Method 2
Although related to docker, the utility envplate should do the job https://github.com/kreuzwerker/envplate
From the readme:
Trivial templating for configuration files using environment keys. References to such keys are declared in arbitrary config files either as:
${key} or
${key:-default value}
gnutext’s envsubst only replaces ${key}; if missing is replaced by ''.
Method 3
Before calling envsubst you should use export using single quotes to get back VAR_1 modified. As in:
export VAR_1='somevalue'
For more details, please see:
How to substitute shell variables in complex text files
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0