Home > Enterprise >  Resolve variable in bash
Resolve variable in bash

Time:08-24

I have a file contains a few lines, and in some lines there is a variable like this:

The-first-line
The-second-${VARIABLE}-line
The-third-line

In a bash scrip, I want to read the lines and resolve the variable wherever exists.

VARIABLE=Awesome
LINES=$(echo $(cat file.txt))
for i in $LINES
do :
  echo "$i"
done

The output is same as the input file (unresolved variables) but I want something like this:

The-first-line
The-second-Awesome-line
The-third-line

Thanks in advance for any help!

CodePudding user response:

You can try the following (with a recent enough version of bash that supports namerefs):

while IFS= read -r line; do
  while [[ "$line" =~ (.*)\$\{([^}] )\}(.*) ]]; do
    declare -n var="${BASH_REMATCH[2]}"
    printf -v line '%s%s%s' "${BASH_REMATCH[1]}" "$var" "${BASH_REMATCH[3]}"
  done
  printf '%s\n' "$line"
done < file.txt

In the innermost loop we iterate as long as there is a ${VARIABLE} variable reference, that we replace by the variable's value, thanks to BASH_REMATCH, the var nameref and the -v option of printf.

CodePudding user response:

If you export your variable you may find envsubst does what you want (eg, How to substitute shell variables in complex text files).

For this particular case:

$ export VARIABLE='Awesome'  # or: VARIABLE='Awesome'; export VARIABLE
$ envsubst < file.txt
The-first-line
The-second-Awesome-line
The-third-line

CodePudding user response:

A quick way to do this would be using the sed command to replace ${variable} in the line with $VARIABLE. Make sure to escape the $ in ${VARIABLE} so it doesn't think it's an actual variable. And to use double quotes so it references the variable in $VARIABLE.

VARIABLE=Awesome
LINES=$(echo $(cat var_file))
for i in $LINES
do :
  echo $i | sed "s/\${VARIABLE}/$VARIABLE/"
done

Let me know if this works for you or if you have any questions.

  • Related