Echo nieuwe regel in Bash drukt letterlijk \n

In Bash, probeerde dit:

echo -e "Hello,\nWorld!"

Maar het drukt geen nieuwe regel af, alleen \n. Hoe kan ik ervoor zorgen dat de nieuwe regel wordt afgedrukt?

Ik gebruik Ubuntu 11.04(Natty Narwhal ).


Antwoord 1, autoriteit 100%

Je zou in plaats daarvan printfkunnen gebruiken:

printf "hello\nworld\n"

printfvertoont consistenter gedrag dan echo. Het gedrag van echovarieert sterk tussen verschillende versies.


Antwoord 2, autoriteit 57%

Zorg ervoor dat je in Bash bent. Al deze vier manieren werken voor mij:

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

Antwoord 3, autoriteit 19%

echo $'hello\nworld'

afdrukken

hello
world

$''tekenreeksen gebruiken ANSI C Citeren:

Woorden van de vorm $'string'worden speciaal behandeld. Het woord wordt uitgebreid tot tekenreeks, waarbij backslash-escapetekens worden vervangen zoals gespecificeerd door de ANSI C-standaard.


Antwoord 4, autoriteit 5%

Je zou altijd echo ""kunnen doen.

Bijvoorbeeld

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

Antwoord 5, autoriteit 3%

Probeer

echo -e "hello\nworld"
hello
world

Het werkte voor mij in de nano-editor.

Van de man-pagina:

-einterpretatie van backslash-escapes inschakelen


Antwoord 6

In het geval dat iemand zijn hoofd tegen de muur slaat terwijl hij probeert te achterhalen waarom het script van een collega geen nieuwe regels afdrukt, let dan op het volgende:

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

Zoals in het bovenstaande, kan het daadwerkelijke uitvoeren van de methode zelf worden verpakt in een echo die alle echo’s die in de methode zelf voorkomen, vervangt. Uiteraard heb ik dit voor de beknoptheid afgezwakt. Het was niet zo gemakkelijk te herkennen!

U kunt uw kameraden dan informeren dat een betere manier om functies uit te voeren als volgt zou zijn:

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

Antwoord 7

Typ gewoon

echo

om een ​​nieuwe regel te krijgen


Antwoord 8

Dit werkt voor mij in Raspbian,

echo -e "hello\\nworld"

Antwoord 9

POSIX 7 op echo

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

-eis niet gedefinieerd en backslashes zijn implementatie gedefinieerd:

Als de eerste operand -n is, of als een van de operands een <backslash> karakter, de resultaten zijn implementatie-gedefinieerd.

tenzij je een optionele XSI-extensie hebt.

Dus ik raad aan dat u printfin plaats daarvan, wat goed gespecificeerd is:

format-operand zal worden gebruikt als de format-string beschreven in XBD File Format Notation […]

de Bestandsindeling notatie:

\n <nieuwe regel> Verplaats de afdrukpositie naar het begin van de volgende regel.

Houd er ook rekening mee dat Ubuntu 15.10 en de meeste distributies echobeide implementeren als:

  • een ingebouwde Bash: help echo
  • een zelfstandig uitvoerbaar bestand: which echo

wat tot enige verwarring kan leiden.


Antwoord 10

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

Antwoord 11

U kunt ook het volgende doen:

echo "hello
world"

Dit werkt zowel binnen een script als vanaf de opdrachtregel.

Druk op de opdrachtregel op Shift+Enterom de regel te beëindigen binnen de tekenreeks.

Dit werkt voor mij op mijn macOS en mijn Ubuntu 18.04(Bionic Beaver) systeem.


Antwoord 12

Het werkt voor mij in CentOS:

echo -e ""hello\nworld""

Antwoord 13

Ik gebruik gewoon echo zonder argumenten:

echo "Hello"
echo
echo "World"

Antwoord 14

Mijn script:

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

Uitvoer:

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

Op mijn Bash-script werd ik net zo boos als jij, totdat ik het net probeerde:

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

Druk gewoon op Enterwaar je die sprong wilt invoegen. De uitvoer is nu:

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

Antwoord 15

Dit kan beter worden gedaan als

x="\n"
echo -ne $x

-e optie interpreteert backslahes voor de escape-reeks
-n optie verwijdert de laatste nieuwe regel in de uitvoer

PS: de commando-echo heeft als effect dat er altijd een nieuwe regel in de uitvoer wordt opgenomen, dus -n is vereist om dat ding uit te schakelen (en het minder verwarrend te maken)


Antwoord 16

Als je scripts schrijft en nieuwe regels meerdere keren herhaalt als onderdeel van andere berichten, is een mooie platformonafhankelijke oplossing om een ​​letterlijke nieuwe regel in een variabele te plaatsen, zoals:

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

Antwoord 17

Nog een item hier voor degenen die het niet hebben laten werken met een van deze oplossingen en een retourwaarde van hun functie nodig hebben:

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

Alleen deze truc werkte op een Linux-systeem waar ik aan werkte met deze Bash-versie:

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

Antwoord 18

Er is een nieuweparameteruitbreidingtoegevoegd in Bash 4.4 die escape-reeksen interpreteert:

${[email protected]} - E operator

De uitbreiding is een string die de waarde is van parameter met
backslash escape-reeksen uitgebreid zoals met het $'…'aanhalingsteken
mechanisme.

$ foo='hello\nworld'
$ echo "${[email protected]}"
hello
world

Antwoord 19

Je zou echo ook met accolades kunnen gebruiken,

$ (echo hello; echo world)
hello
world

Antwoord 20

Dit is misschien niet van toepassing in jouw geval, maar het is iets dat me in het verleden in verwarring heeft gebracht:

Fout

Het schrijven van "hello\nworld"in Bash geeft je een string met een nieuwe regel erin, en echo -edrukt die exacte string af.

>

Juist

Schrijven $'hello\nworld'of

"hello
world"

geeft je een tekenreeks met een teken voor een nieuwe regel erin, en gewone echodrukt die exacte tekenreeks af. Dat is goed, want zoals je hebt gezien, wordt echo -eniet altijd ondersteund.


Antwoord 21

Soms kun je meerdere tekenreeksen doorgeven, gescheiden door een spatie, en het wordt geïnterpreteerd als \n.

Bijvoorbeeld bij gebruik van een shellscript voor meldingen met meerdere regels:

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

Antwoord 22

Hierdoor ben ik daar….

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

Opbrengsten:

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]

Antwoord 23

Aanvullende oplossing:

In gevallen moet u een multiregel van de lange inhoud herhalen (zoals code/configuraties)

Bijvoorbeeld:

  • Een Bash-script om codes/configuraties te genereren

echo -e,
printfkan enige beperking hebben

Je kunt een speciaal teken gebruiken als tijdelijke aanduiding als regeleinde (zoals ~) en dit vervangen nadat het bestand is gemaakt met tr:

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

Het moet een ander programma aanroepen (tr), wat in orde zou moeten zijn, IMO.

Other episodes