Versuchen Sie in Bash Folgendes:
echo -e "hello\nworld"
Es wird jedoch nicht nur eine neue Zeile gedruckt \n
. Wie kann ich die Newline drucken lassen?
Ich benutze Ubuntu 11.04.
Versuchen Sie in Bash Folgendes:
echo -e "hello\nworld"
Es wird jedoch nicht nur eine neue Zeile gedruckt \n
. Wie kann ich die Newline drucken lassen?
Ich benutze Ubuntu 11.04.
Antworten:
Sie könnten printf
stattdessen verwenden:
printf "hello\nworld\n"
printf
hat konsistenteres Verhalten als echo
. Das Verhalten von echo
variiert stark zwischen verschiedenen Versionen.
printf %"s\n" hello world
- printf wird das Format wiederverwenden, wenn zu viele Argumente angegeben werden
echo
die -e
Option unterstützen.
echo
, -e
ist nur in der Ausgabe selbst gedruckt , damit ich diese Antwort denke vollkommen gültig ist , da echo
hier nicht konsistent ist (es sei denn , wir sind zu einer bestimmten Version zu sprechen).
Bist du sicher, dass du in Bash bist? Funktioniert für mich auf alle vier Arten:
echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
echo Hello ; echo world
-e
param existiert nicht auf allen * nix OS
echo $'hello\nworld'
druckt
hello
world
$''
Zeichenfolgen verwenden ANSI C Quoting :
Wörter der Form werden speziell behandelt. Das Wort wird zu Zeichenfolge erweitert , wobei Zeichen mit Backslash-Escapezeichen gemäß ANSI C-Standard ersetzt werden.
$'string'
Das kannst du immer tun echo ""
.
z.B
echo "Hello"
echo ""
echo "World"
echo ""
funktioniert für mich und ich denke, es ist die einfachste Form, eine neue Zeile zu drucken, auch wenn dies die Frage nicht direkt beantwortet. Prost.
echo -en "\n"
.
echo
ist genug, um eine leere Zeile zu erhalten
Versuchen
echo -e "hello\nworld"
hello
world
arbeitete für mich im nano
Editor.
Von der Manpage:
-e
Aktivieren Sie die Interpretation von Backslash-Escapezeichen
Achten Sie darauf, dass jemand mit dem Kopf gegen die Wand schlägt, um herauszufinden, warum das Skript eines Kollegen keine Zeilenumbrüche druckt
#!/bin/bash
function GET_RECORDS()
{
echo -e "starting\n the process";
}
echo $(GET_RECORDS);
Wie oben kann der tatsächliche Ablauf der Methode selbst in ein Echo eingeschlossen sein, das alle Echos ersetzt, die sich möglicherweise in der Methode selbst befinden. Offensichtlich habe ich dies der Kürze halber verwässert, es war nicht so leicht zu erkennen!
Sie können dann Ihre Kameraden darüber informieren, dass eine bessere Möglichkeit zur Ausführung von Funktionen wie folgt wäre:
#!/bin/bash
function GET_RECORDS()
{
echo -e "starting\n the process";
}
GET_RECORDS;
POSIX 7 auf Echo
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html
-e
ist nicht definiert und Backslashes sind implementierungsdefiniert:
Wenn der erste Operand -n ist oder wenn einer der Operanden ein <backslash> -Zeichen enthält, sind die Ergebnisse implementierungsdefiniert.
es sei denn, Sie haben eine optionale XSI-Erweiterung.
Daher empfehle ich, dass Sie printf
stattdessen verwenden, was gut spezifiziert ist:
Der Formatoperand wird als Formatzeichenfolge verwendet, die in der XBD-Dateiformatnotation [...] beschrieben ist.
die Dateiformatnotation :
\ n <Neue Zeile> Verschieben Sie die Druckposition an den Anfang der nächsten Zeile.
Denken Sie auch daran, dass Ubuntu 15.10 und die meisten Distributionen echo
beide wie folgt implementieren :
help echo
which echo
was zu Verwirrung führen kann.
Einfach eingeben
echo
um eine neue Zeile zu bekommen
str='hello\nworld'
$ echo | sed "i$str"
hello
world
Es funktioniert für mich in CentOS:
echo -e ""hello\nworld""
Sie können auch tun:
echo "hello
world"
Dies funktioniert sowohl innerhalb eines Skripts als auch über die Befehlszeile.
Drücken Sie in der Befehlszeile Shift+ Enter, um die Zeilenumbrüche innerhalb der Zeichenfolge auszuführen.
Dies funktioniert für mich unter meinem MacOS und meinem Ubuntu 18.04
Ein weiterer Eintrag hier für diejenigen, die es mit keiner dieser Lösungen geschafft haben und einen Rückgabewert von ihrer Funktion erhalten müssen:
function foo()
{
local v="Dimi";
local s="";
.....
s+="Some message here $v $1\n"
.....
echo $s
}
r=$(foo "my message");
echo -e $r;
Nur dieser Trick funktionierte unter Linux, an dem ich mit dieser Bash gearbeitet habe:
GNU bash, version 2.2.25(1)-release (x86_64-redhat-linux-gnu)
Hoffe, es hilft jemandem mit ähnlichen Problemen.
Mein Skript:
echo "WARNINGS: $warningsFound WARNINGS FOUND:\n$warningStrings
Ausgabe:
WARNING : 2 WARNINGS FOUND:\nWarning, found the following local orphaned signature file:
In meinem Bash-Skript wurde ich so wütend wie du, bis ich es gerade versucht habe:
echo "WARNING : $warningsFound WARNINGS FOUND:
$warningStrings"
Drücken Sie einfach die Eingabetaste, wo Sie diesen Sprung einfügen möchten. Die Ausgabe lautet jetzt:
WARNING : 2 WARNINGS FOUND:
Warning, found the following local orphaned signature file:
Sie können auch Echo mit geschweiften Klammern verwenden.
$ (echo hello; echo world)
hello
world
echo hello; echo world
Dies könnte besser gemacht werden als
x="\n"
echo -ne $x
Die Option -e interpretiert Backslahes für die Escape-Sequenz
-n Option entfernt die nachfolgende neue Zeile in der Ausgabe
PS: Das Befehlsecho bewirkt, dass immer eine nachgestellte neue Zeile in die Ausgabe aufgenommen wird, sodass -n erforderlich ist, um das Ding auszuschalten (und es weniger verwirrend zu machen).
Es wurde eine neue Parametererweiterung hinzugefügt bash 4.4
, die Escape-Sequenzen interpretiert:
${parameter@operator} - E operator
Die Erweiterung ist eine Zeichenfolge, bei der es sich um den Wert eines Parameters handelt, bei dem Backslash-Escape-Sequenzen wie beim
$'…'
Anführungszeichen erweitert wurden.
$ foo='hello\nworld'
$ echo "${foo@E}"
hello
world
Wenn Sie Skripte schreiben und mehrmals Zeilenumbrüche als Teil anderer Nachrichten wiedergeben, besteht eine gute plattformübergreifende Lösung darin, eine wörtliche Zeilenumbruch in eine Variable wie die folgende einzufügen:
newline='
'
echo "first line$newlinesecond line"
echo "Error: example error message n${newline}${usage}" >&2 #requires usage to be defined
Manchmal können Sie mehrere durch ein Leerzeichen getrennte Zeichenfolgen übergeben, die als interpretiert werden \n
.
Zum Beispiel, wenn Sie ein Shell-Skript für mehrzeilige Benachrichtigungen verwenden:
#!/bin/bash
notify-send 'notification success' 'another line' 'time now '`date +"%s"`
\n
. Es wird als separates Argument für das Programm interpretiert, und das Programm selbst kann dieses Argument in einer neuen Zeile anzeigen. Dies bedeutet jedoch nicht, dass es zu \n
irgendeinem Zeitpunkt konvertiert wurde und vollständig vom Programm abhängig ist.
Das hat mich dorthin gebracht ...
outstuff=RESOURCE_GROUP=[$RESOURCE_GROUP]\\nAKS_CLUSTER_NAME=[$AKS_CLUSTER_NAME]\\nREGION_NAME=[$REGION_NAME]\\nVERSION=[$VERSION]\\nSUBNET-ID=[$SUBNET_ID]
printf $outstuff
Ausbeuten:
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]
Zusätzliche Lösung:
In einigen Fällen müssen Sie den langen Inhalt (z. B. Code / Konfigurationen) mehrzeilig wiedergeben.
Beispielsweise :
echo -e
,
printf
Könnte eine gewisse Einschränkung haben
Sie können ein spezielles Zeichen als Platzhalter als Zeilenumbruch verwenden (z. B. ~
) und es ersetzen, nachdem die Datei mit erstellt wurdetr
echo ${content} | tr '~' '\n' > $targetFile
Es muss ein anderes Programm ( tr
) aufgerufen werden, das IMO in Ordnung sein sollte.