VAR="-e xyz"
echo $VAR
This prints xyz
, for some reason. I don't seem to be able to find a way to get a string to start with -e
.
What is going on here?
VAR="-e xyz"
echo $VAR
This prints xyz
, for some reason. I don't seem to be able to find a way to get a string to start with -e
.
What is going on here?
The answers that say to put $VAR
in quotes are only correct by side effect. That is, when put in quotes, echo(1)
receives a single argument of -e xyz
, and since that is not a valid option string, echo
just prints it out. It is a side effect as echo
could just as easily print an error regarding malformed options. Most programs will do this, but it seems GNU echo
(from coreutils
) and the version built into bash
simply echo strings that start with a hyphen but are not valid argument strings. This behaviour is not documented so it should not be relied upon.
Further, if $VAR
contains a valid echo
option argument, then quoting $VAR will not help:
$ VAR="-e"
$ echo "$VAR"
$
Most GNU programs take --
as an argument to mean no more option processing — all the arguments after --
are to be processed as non-option arguments. bash echo
does not support this so you cannot use it. Even if it did, it would not be portable. echo
has other portability issues (-n
vs \c
, no -e
).
The correct and portable solution is to use printf(1)
.
printf "%s\n" "$VAR"
Try:
echo "$VAR"
instead.
(-e
is a valid option for echo
- this is what causes this phenomenon).
The variable VAR
contains -e xyz
, if you access the variable via $
the -e
is interpreted as a command-line option for echo
. Note that the content of $VAR
is not wrapped into ""
automatically.
Use echo "$VAR"
to fix your problem.
In zsh
, you can use a single dash (-
) before your arguments. This ensures that no following arguments are interpreted as options.
% VAR="-e xyz"
% echo - $VAR
-e xyz
From the zsh
docs:
echo [ -neE ] [ arg ... ]
...
Note that for standards compliance a double dash does not
terminate option processing; instead, it is printed directly.
However, a single dash does terminate option processing, so the
first dash, possibly following options, is not printed, but
everything following it is printed as an argument.
The single dash behaviour is different from other shells.
Keep in mind this behavior is specific to zsh
.