Why does `echo -e "\\\SOME_TEXT"` show only one backslash?
Solution 1:
This is because bash
and echo -e
combined. From man 1 bash
A non-quoted backslash (
\
) is the escape character. It preserves the literal value of the next character that follows, with the exception of<newline>
. […]Enclosing characters in double quotes preserves the literal value of all characters within the quotes, with the exception of
$
,`
,\
, […] The backslash retains its special meaning only when followed by one of the following characters:$
,`
,"
,\
, or<newline>
.
The point is: double quoted backslash is not always special.
There are various implementations of echo
in general, it's a builtin in bash
; the important thing here is this behavior:
If
-e
is in effect, the following sequences are recognized:\\
backslash
[…]\n
new line
Now we can decode:
-
echo -e "\ Hello!"
– nothing special tobash
, nothing special toecho
;\
stays. -
echo -e "\\ Hello!"
– the first\
tellsbash
to treat the second\
literally;echo
gets\ Hello!
and acts as above. -
echo -e "\\\ Hello!"
– the first\
tellsbash
to treat the second\
literally;echo
gets\\ Hello!
and (because of-e
) it recognizes\\
as\
. -
echo -e "\\\\ Hello!"
– the first\
tellsbash
to treat the second\
literally; the third tells the same about the fourth;echo
gets\\ Hello!
and (because of-e
) it recognizes\\
as\
. -
echo -e "\\\\\ Hello!"
– the first\
tellsbash
to treat the second\
literally; the third tells the same about the fourth; the last one is not special;echo
gets\\\ Hello!
and (because of-e
) it recognizes the initial\\
as\
, the last\
stays intact.
And so on. As you can see, up to four consecutive backslashes give one in result. That's why you need (at least) nine of them to get three. 9=4+4+1.
Now with \n
:
-
echo -e "\n Hello!"
– there's nothing special tobash
, echo gets the same string and (because of-e
) it interprets\n
as a newline. -
echo -e "\\n Hello!"
–bash
interprets\\
as\
;echo
gets\n Hello!
and the result is the same as above. -
echo -e "\\\n Hello!"
–bash
interprets the initial\\
as\
;echo
gets\\n Hello!
and (because of-e
) it interprets\\
as a literal\
which needs to be printed.
The results would be different with '
instead of "
(due to different bash
behavior) or without -e
(different echo
behavior).