Echo newline in Bash prints literal \n

BashEchoNewline

Bash Problem Overview


In Bash, tried this:

echo -e "Hello,\nWorld!"

But it doesn't print a newline, only \n. How can I make it print the newline?

I'm using Ubuntu 11.04 (Natty Narwhal).

Bash Solutions


Solution 1 - Bash

You could use printf instead:

printf "hello\nworld\n"

printf has more consistent behavior than echo. The behavior of echo varies greatly between different versions.

Solution 2 - Bash

Make sure you are in Bash.

$ echo $0
bash

All these four ways work for me:

echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
echo Hello ; echo world

Solution 3 - Bash

echo $'hello\nworld'

prints

hello
world

$'' strings use ANSI C Quoting:

> Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard.

Solution 4 - Bash

You could always do echo "".

For example,

echo "Hello,"
echo ""
echo "World!"

Solution 5 - Bash

On the off chance that someone finds themselves beating their head against the wall trying to figure out why a coworker's script won't print newlines, look out for this:

#!/bin/bash
function GET_RECORDS()
{
   echo -e "starting\n the process";
}

echo $(GET_RECORDS);

As in the above, the actual running of the method may itself be wrapped in an echo which supersedes any echos that may be in the method itself. Obviously, I watered this down for brevity. It was not so easy to spot!

You can then inform your comrades that a better way to execute functions would be like so:

#!/bin/bash
function GET_RECORDS()
{
   echo -e "starting\n the process";
}

GET_RECORDS;

Solution 6 - Bash

Simply type

echo

to get a new line

Solution 7 - Bash

POSIX 7 on echo

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

-e is not defined and backslashes are implementation defined:

> If the first operand is -n, or if any of the operands contain a <backslash> character, the results are implementation-defined.

unless you have an optional XSI extension.

So I recommend that you should use printf instead, which is well specified:

> format operand shall be used as the format string described in XBD File Format Notation [...]

the File Format Notation:

> \n <newline> Move the printing position to the start of the next line.

Also keep in mind that Ubuntu 15.10 and most distros implement echo both as:

  • a Bash built-in: help echo
  • a standalone executable: which echo

which can lead to some confusion.

Solution 8 - Bash

str='hello\nworld'
$ echo | sed "i$str"
hello
world

Solution 9 - Bash

You can also do:

echo "hello
world"

This works both inside a script and from the command line.

On the command line, press Shift+Enter to do the line break inside the string.

This works for me on my macOS and my Ubuntu 18.04 (Bionic Beaver) system.

Solution 10 - Bash

There is a new parameter expansion added in Bash 4.4 that interprets escape sequences:

> ${parameter@operator} - E operator > > The expansion is a string that is the value of parameter with > backslash escape sequences expanded as with the $'…' quoting > mechanism.

$ foo='hello\nworld'
$ echo "${foo@E}"
hello
world

Solution 11 - Bash

I just use echo without any arguments:

echo "Hello"
echo
echo "World"

Solution 12 - Bash

To print a new line with echo, use:

echo

or

echo -e '\n'

Solution 13 - Bash

My script:

echo "WARNINGS: $warningsFound WARNINGS FOUND:\n$warningStrings

Output:

WARNING : 2 WARNINGS FOUND:\nWarning, found the following local orphaned signature file:

On my Bash script I was getting mad as you until I've just tried:

echo "WARNING : $warningsFound WARNINGS FOUND:
$warningStrings"

Just hit Enter where you want to insert that jump. The output now is:

WARNING : 2 WARNINGS FOUND:
Warning, found the following local orphaned signature file:

Solution 14 - Bash

This could better be done as

x="\n"
echo -ne $x

-e option will interpret backslahes for the escape sequence
-n option will remove the trailing newline in the output

PS: the command echo has an effect of always including a trailing newline in the output so -n is required to turn that thing off (and make it less confusing)

Solution 15 - Bash

If you're writing scripts and will be echoing newlines as part of other messages several times, a nice cross-platform solution is to put a literal newline in a variable like so:

newline='
'

echo "first line$newlinesecond line"
echo "Error: example error message n${newline}${usage}" >&2 #requires usage to be defined

Solution 16 - Bash

If the previous answers don't work, and there is a need to get a return value from their function:

function foo()
{
    local v="Dimi";
    local s="";
    .....
    s+="Some message here $v $1\n"
    .....
    echo $s
}

r=$(foo "my message");
echo -e $r;

Only this trick worked on a Linux system I was working on with this Bash version:

GNU bash, version 2.2.25(1)-release (x86_64-redhat-linux-gnu)

Solution 17 - Bash

You could also use echo with braces,

$ (echo hello; echo world)
hello
world

Solution 18 - Bash

This got me there....

outstuff=RESOURCE_GROUP=[$RESOURCE_GROUP]\\nAKS_CLUSTER_NAME=[$AKS_CLUSTER_NAME]\\nREGION_NAME=[$REGION_NAME]\\nVERSION=[$VERSION]\\nSUBNET-ID=[$SUBNET_ID]
printf $outstuff

Yields:

RESOURCE_GROUP=[akswork-rg]
AKS_CLUSTER_NAME=[aksworkshop-804]
REGION_NAME=[eastus]
VERSION=[1.16.7]
SUBNET-ID=[/subscriptions/{subidhere}/resourceGroups/makeakswork-rg/providers/Microsoft.Network/virtualNetworks/aks-vnet/subnets/aks-subnet]

Solution 19 - Bash

Sometimes you can pass multiple strings separated by a space and it will be interpreted as \n.

For example when using a shell script for multi-line notifcations:

#!/bin/bash
notify-send 'notification success' 'another line' 'time now '`date +"%s"`

Solution 20 - Bash

Additional solution:

In cases, you have to echo a multiline of the long contents (such as code/ configurations)

For example:

  • A Bash script to generate codes/ configurations

echo -e, printf might have some limitation

You can use some special char as a placeholder as a line break (such as ~) and replace it after the file was created using tr:

echo ${content} | tr '~' '\n' > $targetFile

It needs to invoke another program (tr) which should be fine, IMO.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSergeyView Question on Stackoverflow
Solution 1 - BashsthView Answer on Stackoverflow
Solution 2 - BashchorobaView Answer on Stackoverflow
Solution 3 - BashVanuanView Answer on Stackoverflow
Solution 4 - BashNayeem ZenView Answer on Stackoverflow
Solution 5 - BashUncle IrohView Answer on Stackoverflow
Solution 6 - BashR SunView Answer on Stackoverflow
Solution 7 - BashCiro Santilli Путлер Капут 六四事View Answer on Stackoverflow
Solution 8 - BashalinsoarView Answer on Stackoverflow
Solution 9 - BashvinzeeView Answer on Stackoverflow
Solution 10 - BashPesaTheView Answer on Stackoverflow
Solution 11 - BashXenonView Answer on Stackoverflow
Solution 12 - BashAnishView Answer on Stackoverflow
Solution 13 - BashTanisDLJView Answer on Stackoverflow
Solution 14 - BashDhwanitView Answer on Stackoverflow
Solution 15 - BashskiggetyView Answer on Stackoverflow
Solution 16 - BashDNTView Answer on Stackoverflow
Solution 17 - BashAvinash RajView Answer on Stackoverflow
Solution 18 - BashJoe HealyView Answer on Stackoverflow
Solution 19 - BashHunter FrazierView Answer on Stackoverflow
Solution 20 - BashZenithSView Answer on Stackoverflow