Evaluating variables in a string in bash

bash

Solution

Let's take things step by step:

When you do this:

mycmd='cat $myfile'

You prevent the shell from interpolating `$myfile`. Thus:

$ echo $mycmd
cat $myfile

If you want to allow the interpolation, you can use double quotes:

$ mycmd="echo $myfile"  #Double quotes!
$ echo "$mycmd"
cat afile.txt

This, of course, freezes the interpretation of `$mycmd` when you do an `eval`.

$ myfile="afile.txt"
$ mycmd="echo $myfile"
$ echo $mycmd
cat afile.txt
$ eval $mycmd   #Prints out afile.txt
$ myfile=bfile.txt
$ eval $mycmd   #Still prints out afile.txt and not bfile.txt

Compare this to:

$ myfile="afile.txt"
$ mycmd='cat $myfile'   #Single quotes hide $myfile from the shell
echo $mycmd
cat $myfile             #Shell didn't change "$myfile", so it prints as a literal
$ eval $mycmd           #Prints out afile.txt
$ myfile=bfile.txt
$ eval $mycmd           #Now prints out bfile.txt

What you probably want to do is to evaluate the `$mycmd` in an echo statement when you echo it:

$ echo $(eval "echo $mycmd")
$ cat afile.txt
$ myfile=bfile.txt
$ echo $(eval "echo $mycmd")
cat bfile.txt

Problem

The last line in this script won't work as I expect: ``` myfile="afile.txt" mycmd='cat $myfile' eval $mycmd echo eval $mycmd ``` Here `echo eval $mycmd` prints `eval cat $myfile`. How can I print `eval cat afile.txt`?

Original source