I'm trying to print -n
using the echo
command. But if i simply type echo -n
, it only issues a newline, not show up -n
, instead it issues a newline.
9 Answers
The problem is that echo
interprets the -n
as an argument. On the default bash implementation, that means (from help echo
):
-n do not append a newline
There are various ways of getting around that:
Make it into something that isn't an option by including another character. For example, tell
echo
not to print a newline with-n
, then tell it to interpret backslash escapes with-e
and add the newline explicitly.$ echo -ne '-n\n' -n
Alternatively, just include a space
$ echo " -n" -n
That, however, adds a space which you probably don't want.
Use a non-printing character before it. Here. I am using the backspace (
\b
)$ echo -e "\b-n" -n
This also adds an extra character you probably don't want.
Use trickery
$ echo n- | rev -n
The
rev
command simply prints its output reversed.Use the right tool for the job
$ printf -- '-n\n' -n
-
-
@Pilot6 yeah but the problem with that approach (yours and mine) is that it adds an extra character. That can cause issues down the line. Especially if you then want to parse it and try something like
grep '^-n'
.pritnf
is the way to go, really.– terdonNov 23, 2015 at 18:10 -
Well,
printf
is better anyway, but the question is regarding justecho
.– Pilot6Nov 23, 2015 at 18:11 -
3
-
1
Sometimes it's a good idea to use the right tool. You could use printf
instead:
% printf "-n\n"
-n
-
1This is a good idea, since there are many variants of
echo
, whileprintf
is better standardized. Nov 25, 2015 at 0:22 -
You can use this command, but it adds an extra space.
echo -e "\r-n"
This is a kind of a hack.
-e
enables backslash command symbols.
\r
is a carriage return.
Actually any \
valid character will do in any place of the string.
You can see which are valid by help echo
.
echo "-n"
does not work because -n
is used as a parameter for echo
.
P.S. The best solution IMHO is
echo -e "-n\c"
It does not add any extra characters.
echo -e "-n\n"
prints the same but with a new line char.
-
1Wov! This is better than mine; can you explain a bit for "beginners" ;-)– SadiNov 23, 2015 at 17:59
-
Thanks, I've also noticed that it doesn't matter where you add the carriage return, at the beginning or the end.– SadiNov 23, 2015 at 18:05
-
@Sadi yes, that's because adding anything makes it a non-valid option.
-n
is valid,-nfoo
is not so that will be printed.– terdonNov 23, 2015 at 18:20 -
-
I know it has it, it's just not relevant.
/bin/echo
is a completely different thing and when you runecho
in bash, you get the builtin which can be quite different depending on your shell.– terdonNov 23, 2015 at 18:23
I think if you definitely want to use echo
only, this should satisfy you:
echo "-n "
This works because while -n
is a valid option for echo
, -n
with a space after it is not. Since it isn't an option, echo
just prints it.
You guys are really overthinking it.
echo -e \\055n
Or with no trailing newline
echo -en \\055n
-
-
Yup, I just answered this way. Will delete my answer. This is relatively portable in that it works with built-in echo and
/bin/echo
at least if invoked asecho -e "\055n"
– ablighNov 24, 2015 at 14:05 -
To extend @A.B's answer, the only portable way to use echo
is to refrain from using any options like -n
. Consider use printf
instead where available. This reference page provides more details and explains very well when and how echo
and printf
should be used:
Nowadays, echo(1) is only portable if you omit flags and escape sequences. Use printf(1) instead, if you need more than plain text.
-
-
I'm not sure it's a good idea to alter someone else's answer to the point when it will have more text from me than from the original author. Dec 8, 2015 at 14:46
In Bash script you can run:
echo -n -
echo n
Or in interacive shell:
echo -n - ; echo n
This echo
es a -
character and an n
character.
-
-
-
-
@Pilot6 Depends on whether you're running it in interactive terminal or in a bash script, which isn't specified in the question. OTOH if you need it in the terminal it is simple to just combine the two lines with
&&
- I wouldn't really say this answer is wrong. Nov 23, 2015 at 21:16 -
Three other ways:
$ echo -e '\x2dn' # ASCII hexadecimal value
-n
$ echo -e '\u002dn' # Unicode code point
-n
$ echo -e '\u2dn' # Unicode code point shortened
-n
You can run
printf -n;echo
Tested in Busybox Ash
-
1
-
-
Say "Busybox" or "Busybox Ash". Not just "Ash" beacuse people may think of that pokemon character or the ******* ash from volcanoes.– Star OSDec 8, 2015 at 21:22
-
-
echo -n -- -n
work (don't have any linux box handy to test)?getopt
(???) to parse command line