How do I print a newline? This merely prints \n:
$ echo -e "Hello,\nWorld!" Hello,\nWorld! 1022 Answers
Use printf instead:
printf "hello\nworld\n" printf behaves more consistently across different environments than echo.
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 15echo $'hello\nworld' prints
hello world $'' strings use ANSI C Quoting:
7Words of the form
$'string'are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard.
You could always do echo "".
For example,
echo "Hello," echo "" echo "World!" 5On 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; 1Simply type
echo to get a new line
7POSIX 7 on echo
-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.
str='hello\nworld' $ echo | sed "i$str" hello world 2You 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.
0There is a new parameter expansion added in Bash 4.4 that interprets escape sequences:
${parameter@operator} - E operatorThe 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 1I just use echo without any arguments:
echo "Hello" echo echo "World" 1To print a new line with echo, use:
echo or
echo -e '\n' 1This 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)
1If 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 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: 3If 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) You could also use echo with braces,
$ (echo hello; echo world) hello world 4This 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/ 2Sometimes 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"` 1For only the question asked (not special characters etc) changing only double quotes to single quotes.
echo -e 'Hello,\nWorld!'
Results in:
Hello, World! With jq:
$ jq -nr '"Hello,\nWorld"' Hello, World 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.