How do I print a newline? This merely prints \n
:
$ echo -e "Hello,\nWorld!"
Hello,\nWorld!
How do I print a newline? This merely prints \n
:
$ echo -e "Hello,\nWorld!"
Hello,\nWorld!
Use printf
instead:
printf "hello\nworld\n"
printf
behaves more consistently across different environments than echo
.
printf %"s\n" hello world
-- printf will reuse the format if too many arguments are given –
Matrilateral echo
happens to support the -e
option. –
Signatory echo
, -e
is just printed in the output itself so I think this answer is perfectly valid since echo
isn't consistent here (unless we're talking about a specific version). –
Uda man bash
under "SHELL BUILTIN COMMANDS"). It's not distro-dependent in this case. –
Eakin printf "#\!/bin/bash > output.sh
to work the way I would expect. –
Albany printf
command has been standard for quite some time, and is also present as an executable, in case one's shell doesn't have it as a builtin. printf
is regarded as the portable, reliable choice. You said "unlike echo sometimes printf isn't on the distro"--are there real examples of Unix-like (even if not generally POSIX-conforming) operating systems, that people actually use, that don't have a printf
command? –
Conakry printf "%b" "hello\nworld\n"
Also to read more: wiki.bash-hackers.org/commands/builtin/printf –
Skewbald printf
is POSIX-specified in far more detail than echo
is. That is to say, many different echo
behaviors can call themselves POSIX-compliant, but every POSIX-compliant UNIX will have a printf
command that behaves exactly the same way included (for all the standard-defined operators). –
Thole printf
, but I end up with a trailing seemingly selected '%' sign. printf "abc"
=> ouputs abc%
(running zsh on Debian GNU/Linux 10 (buster)) Thus falling back to the echo -e
option –
Lair \n
and the %
is your shell prompt? –
Signatory %
is not printed by printf
, it's printed by zsh as part of its command prompt. Bash uses $
or something more complicated instead, that's why it looks different with bash. printf
prints the same thing both times, and following that the shell prints it's command prompt. This command prompt looks different in zsh than in bash/sh. –
Signatory zsh
printing a %
to indicate that there was no trailing newline in the output, before unconditionally putting the prompt on the next line. (bash
, by contrast, would simply print the prompt on the same line as the last of the output.) zsh
's behavior is controlled by the PROMPT_SP
and PROMPT_EOL_MARK
options. –
Samp 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
-e
param doesn't exist on all *nix OS –
Tiemroth echo -e hello\\nworld
–
Fulguration help echo
(in bash) shows a different page that describes the bash builtin. –
Transpacific man echo
doesn't. –
Transpacific echo -e
flag that makes this work as expected. –
Licko echo
doesn't have to support the -e
flag. That's why I asked. –
Transpacific echo -e
and printf
? Are there any performance penalties for using printf
? Thanks in advance. –
Anthracoid echo -e
might not be supported in other shells. echo
doesn't understand the %
placeholders that printf
uses. –
Transpacific &
makes a process go in background, so I would try echo Hello && echo world
(the difference here is && instead of &) –
Nadeau &&
is what I meant (&
prints some undesired extra message about completion of the task). Plus echo Hello && echo world
even works on Windows (where A && B
means to execute B
only when A
executed successfully). –
Paugh ;
if you simply don't care about the exit code(if the prev.commands was run s.fully or failed) it's shorter too, so yea, and have a nice day! –
Nadeau echo $'hello\nworld'
prints
hello
world
$''
strings use ANSI C Quoting:
Character sequences of the form
$’string’
are treated as a special kind of single quotes. The sequence expands to string, with backslash-escaped characters in string replaced as specified by the ANSI C standard.
GNU bash, version 4.4.23(1)-release (x86_64-pc-msys) W10
like a charm. –
Malarkey read -p prompt
: read -p $'Quick!\n' -t 1
–
Arrearage sh
compatible –
Lambdacism You could always do echo ""
.
For example,
echo "Hello,"
echo ""
echo "World!"
echo ""
works for me and I think it's the simplest form to print a new line, even if this doesn't directly answer the question. Cheers. –
Piquet echo -en "\n"
. –
Audrit echo
is enough to obtain an empty line –
Oboe \n
did not work when you are using the read
. But your method worked for adding a line. –
Bibliolatry 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;
Simply type
echo
to get a new line
clear
command –
Unjaundiced For only the question asked (not special characters etc) changing only double quotes to single quotes.
echo -e 'Hello,\nWorld!'
Results in:
Hello,
World!
RHEL 9.7
and works fine. –
Disheveled 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:
help echo
which echo
which can lead to some confusion.
str='hello\nworld'
$ echo | sed "i$str"
hello
world
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.
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
I just use echo without any arguments:
echo "Hello"
echo
echo "World"
Hello
is followed by two line breaks and not only one. –
Frannie To print a new line with echo, use:
echo
or
echo -e '\n'
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:
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)
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${newline}second line"
echo "Error: example error message n${newline}${usage}" >&2 #requires usage to be defined
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)
You could also use echo with braces,
$ (echo hello; echo world)
hello
world
echo hello; echo world
–
Towhee 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]
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"`
\n
. It is interpreted as a separate argument to the program, and the program itself may display that argument on a new line, but that doesn't mean that it was converted to \n
at any point and is entirely dependent on the program. –
Hexapartite I would like to add that when you try to echo lines after running a process in the background, like some_script &
, you lost the implicit \r
(carriage return) in a new line so the output of:
some_script &
echo "firsf"
echo "second"
could be something like:
fist
second
There is a line break, but not a "carriage return", to fix this, we could add \r
:
echo -e 'fist\r'
echo -e 'second\r'
You can just use PHP_EOL
echo "Hello" . PHP_EOL . "World";
result in console :
Hello
World
Additional solution:
In cases, you have to echo a multiline of the long contents (such as code/ configurations)
For example:
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.
tr
in this case. Furthermore, what if the text includes a ~
already? –
Kilan With jq:
$ jq -nr '"Hello,\nWorld"'
Hello,
World
© 2022 - 2024 — McMap. All rights reserved.
echo -n
man page entry on archlinux ` -n do not output the trailing newline` It has nothing to do with interpreting escapes – AlrickGNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
) – Enfieldecho
adds a newline by default you could always runecho "Hello," && echo "World!"
– Eliezerecho
pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html – Judyjudye-n
preventsecho
from writing a trailing newline, that's it. It has nothing to do with interrupting the digraph\n
as a literal newline character: that's what-e
is for. – Samp