> 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
But generally is a bad idea to put commands with parameters in one string. Use an array instead:
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:
the shell should absolutely not remove the quotes: the string containing spaces would get parsed as 3 smaller strings.