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.
- 2,468
- 3
- 18
- 24
-
Does `echo -n -- -n` work (don't have any linux box handy to test)? – n0rd Nov 23 '15 at 19:07
-
I'm installing Ubuntu in a virtual machine and it seems to be very slow, wait. – Star OS Nov 23 '15 at 19:07
-
1I've checked - it does not. Probably because it's internal bash command and it's not using `getopt` (???) to parse command line – n0rd Nov 23 '15 at 19:46
-
1This question is asked and answered in http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html - - "Conforming applications that ... could possibly be expecting to echo a -n, should use the printf utility derived from the Ninth Edition system" – Brandin Nov 25 '15 at 09:42
-
First popular question i have made. Yay? – Star OS Dec 08 '15 at 22:05
-
... 100 reputation on all of my communities? Nice reward, moderators! – Star OS Dec 15 '15 at 08:58
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
echonot to print a newline with-n, then tell it to interpret backslash escapes with-eand add the newline explicitly.$ echo -ne '-n\n' -nAlternatively, just include a space
$ echo " -n" -nThat, 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" -nThis also adds an extra character you probably don't want.
Use trickery
$ echo n- | rev -nThe
revcommand 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. – terdon Nov 23 '15 at 18:10
-
Well, `printf` is better anyway, but the question is regarding just `echo`. – Pilot6 Nov 23 '15 at 18:11
-
3
-
@Pilot6 nice! What is `\c`? I don't see it in `man ascii`. Also, I just realized that `echo -ne '-n\n'` prints `-n\n` and only that, just as desired. – terdon Nov 23 '15 at 18:39
-
1
-
-
Sometimes it's a good idea to use the right tool. You could use printf instead:
% printf "-n\n"
-n
- 89,123
- 21
- 245
- 323
-
1This is a good idea, since [there are many variants of `echo`, while `printf` is better standardized](http://unix.stackexchange.com/q/65803/17535). – 200_success Nov 25 '15 at 00: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.
- 88,764
- 91
- 205
- 313
-
1
-
Thanks, I've also noticed that it doesn't matter where you add the carriage return, at the beginning or the end. – Sadi Nov 23 '15 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. – terdon Nov 23 '15 at 18:20
-
-
I know it has it, it's just not relevant. `/bin/echo` is a completely different thing and when you run `echo` in bash, you get the builtin which can be quite different depending on your shell. – terdon Nov 23 '15 at 18:23
-
You can also print the extra character, and then erase it: `echo -e "- \x08n"` – Benubird Nov 24 '15 at 10:57
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
- 689
- 3
- 8
-
-
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 as `echo -e "\055n"` – abligh Nov 24 '15 at 14:05
-
In Bash script you can run:
echo -n -
echo n
Or in interacive shell:
echo -n - ; echo n
This echoes a - character and an n character.
- 209
- 1
- 3
-
-
@Pilot6 [Did you try it? It is *not* wrong.](https://ideone.com/sPtlG4) – user12205 Nov 23 '15 at 21:11
-
-
@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*. – user12205 Nov 23 '15 at 21:16
-
-
This uses trickery. You can print anything with it. For example, this prints "cats": echo -n c ; echo -n a ; echo -n t ; echo s If it was echo 2 ; echo 3, it would output 2 in line 1 and 3 in line 2. By doing -n to all of these except the last it would bring all the characters to line 2. So -(line1)n(line2) becomes (line1)-n(line2) – Star OS Dec 08 '15 at 21:32
-
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.
- 1,852
- 13
- 23
-
-
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. – Dmitry Grigoryev Dec 08 '15 at 14:46
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
- 35,535
- 13
- 101
- 151
You can run
printf -n;echo
Tested in Busybox Ash
- 209
- 1
- 3
-
1
-
-
Say "Busybox" or "Busybox Ash". Not just "Ash" beacuse people may think of that pokemon character or the ******* ash from volcanoes. – Star OS Dec 08 '15 at 21:22
-
-