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 printf
kunnen gebruiken:
printf "hello\nworld\n"
printf
vertoont consistenter gedrag dan echo
. Het gedrag van echo
varieert 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:
-e
interpretatie 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
-e
is 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 printf
in plaats daarvan, wat goed gespecificeerd is:
format-operand zal worden gebruikt als de format-string beschreven in XBD File Format Notation […]
\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 echo
beide 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:
${parameter@operator} - 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 "${foo@E}"
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 -e
drukt 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 echo
drukt die exacte tekenreeks af. Dat is goed, want zoals je hebt gezien, wordt echo -e
niet 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
,
printf
kan 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.