Bash: echo string that starts with "-"
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"
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.