How do I print a newline? This merely prints \n
:
$ echo -e "Hello,\nWorld!"
Hello,\nWorld!
echo -n
man page entry on archlinux ` -n do not output the trailing newline` It has nothing to do with interpreting escapes - anyone Use printf
instead:
printf "hello\nworld\n"
printf
behaves more consistently across different environments than echo
.
Answered 2023-09-20 20:17:14
printf %"s\n" hello world
-- printf will reuse the format if too many arguments are given - anyone echo
happens to support the -e
option. - anyone 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). - anyone 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
Answered 2023-09-20 20:17:14
-e
param doesn't exist on all *nix OS - anyone 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.
Answered 2023-09-20 20:17:14
GNU bash, version 4.4.23(1)-release (x86_64-pc-msys) W10
like a charm. - anyone read -p prompt
: read -p $'Quick!\n' -t 1
- anyone You could always do echo ""
.
For example,
echo "Hello,"
echo ""
echo "World!"
Answered 2023-09-20 20:17:14
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. - anyone echo -en "\n"
. - anyone echo
is enough to obtain an empty line - anyone \n
did not work when you are using the read
. But your method worked for adding a line. - anyone 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;
Answered 2023-09-20 20:17:14
Simply type
echo
to get a new line
Answered 2023-09-20 20:17:14
clear
command - anyone 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.
Answered 2023-09-20 20:17:14
For only the question asked (not special characters etc) changing only double quotes to single quotes.
echo -e 'Hello,\nWorld!'
Results in:
Hello,
World!
Answered 2023-09-20 20:17:14
RHEL 9.7
and works fine. - anyone str='hello\nworld'
$ echo | sed "i$str"
hello
world
Answered 2023-09-20 20:17:14
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.
Answered 2023-09-20 20:17:14
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
Answered 2023-09-20 20:17:14
I just use echo without any arguments:
echo "Hello"
echo
echo "World"
Answered 2023-09-20 20:17:14
Hello
is followed by two line breaks and not only one. - anyone 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)
Answered 2023-09-20 20:17:14
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:
Answered 2023-09-20 20:17:14
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
Answered 2023-09-20 20:17:14
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)
Answered 2023-09-20 20:17:14
You could also use echo with braces,
$ (echo hello; echo world)
hello
world
Answered 2023-09-20 20:17:14
echo hello; echo world
- anyone 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]
Answered 2023-09-20 20:17:14
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"`
Answered 2023-09-20 20:17:14
\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. - anyone 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'
Answered 2023-09-20 20:17:14
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.
Answered 2023-09-20 20:17:14
tr
in this case. Furthermore, what if the text includes a ~
already? - anyone