20

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.

Star OS
  • 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
  • 1
    I'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
  • 1
    This 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 Answers9

31

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:

  1. 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
    
  2. Alternatively, just include a space

    $ echo " -n"
     -n
    

    That, however, adds a space which you probably don't want.

  3. 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.

  4. Use trickery

    $ echo n- | rev
    -n
    

    The rev command simply prints its output reversed.

  5. Use the right tool for the job

    $ printf -- '-n\n'
    -n
    
terdon
  • 98,183
  • 15
  • 197
  • 293
16

Sometimes it's a good idea to use the right tool. You could use printf instead:

% printf "-n\n"       
-n
A.B.
  • 89,123
  • 21
  • 245
  • 323
7

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.

Pilot6
  • 88,764
  • 91
  • 205
  • 313
  • 1
    Wov! This is better than mine; can you explain a bit for "beginners" ;-) – Sadi Nov 23 '15 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. – 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
  • @terdon `man echo` has it too. But `help` is a bit better. – Pilot6 Nov 23 '15 at 18:22
  • 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
5

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.

terdon
  • 98,183
  • 15
  • 197
  • 293
Sadi
  • 10,912
  • 7
  • 48
  • 61
5

You guys are really overthinking it.

 echo -e \\055n

Or with no trailing newline

 echo -en \\055n
Joshua
  • 689
  • 3
  • 8
2

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.

jiwopene
  • 209
  • 1
  • 3
  • Did you try it? It is wrong. – Pilot6 Nov 23 '15 at 20:34
  • @Pilot6 [Did you try it? It is *not* wrong.](https://ideone.com/sPtlG4) – user12205 Nov 23 '15 at 21:11
  • First command outputs `-pilot6@Pilot6:~$`. The second outputs `n`. – Pilot6 Nov 23 '15 at 21:13
  • @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
  • I'll edit it so it becomes much clearer it's for a bash script. – Star OS Dec 08 '15 at 14:14
  • 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
  • Just some explanation about how it works ^^^ – Star OS Dec 08 '15 at 21:52
2

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.

Dmitry Grigoryev
  • 1,852
  • 13
  • 23
1

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
kos
  • 35,535
  • 13
  • 101
  • 151
0

You can run

printf -n;echo

Tested in Busybox Ash

jiwopene
  • 209
  • 1
  • 3