> echo "hi"
hi
> VAR='echo "hi"'
> $VAR
"hi"
Why is the output of the above commands different?
A similar thing occurs with single quotes:
> VAR="echo 'hi'"
> $VAR
> 'hi'
> echo "hi"
hi
> VAR='echo "hi"'
> $VAR
"hi"
Why is the output of the above commands different?
A similar thing occurs with single quotes:
> VAR="echo 'hi'"
> $VAR
> 'hi'
The extra pair of quotes would be consumed only by an extra evaluation step. For example forced by eval:
bash-4.2$ VAR='echo "hi"'
bash-4.2$ $VAR
"hi"
bash-4.2$ eval $VAR
hi
But generally is a bad idea to put commands with parameters in one string. Use an array instead:
bash-4.2$ VAR=(echo "hi")
bash-4.2$ "${VAR[@]}"
hi
Quote removal only occurs on the original input words, not on the result of expansions. Quotes that are part of expanded variables are untouched.
If you step back a bit, you can see why variable substitution absolutely should retain quotes.
The point of quotes in a Unix/Linux/BSD shell is to keep pieces of a string together that would otherwise get parsed as multiple strings. Since by default a shell uses whitespace as a token separator, a string with spaces (like "one two three") if not quoted or escaped somehow, would get parsed as 3 strings: "one", "two" and "three".
If a programmer wants a string with the value of some variable interpolated:
VAR=two
STRING="one $VAR three"
the shell should absolutely not remove the quotes: the string containing spaces would get parsed as 3 smaller strings.