430 Stimmen

Wie gibt man eine mehrzeilige Zeichenkette in Bash aus?

Wie kann ich in Bash eine mehrzeilige Zeichenfolge ausgeben, ohne mehrere echo-Aufrufe wie folgt zu verwenden:

echo "Verwendung: up [--level | -n ][--help][--version]"
echo 
echo "Fehler melden an: "
echo "up Homepage: "

Ich suche einen portablen Weg, dies zu tun, nur mit den in Bash integrierten Funktionen.

6 Stimmen

Wenn Sie eine Verwendungsnachricht als Antwort auf einen falschen Aufruf ausgeben, senden Sie diese normalerweise an den Standardfehlerausgang anstelle des Standardausgangs, mit echo >&2 ...

3 Stimmen

@MarkReed Die Verwendungsnachricht wird ausgegeben, indem --help eingegeben wird (was standardmäßig ausgegeben werden sollte).

3 Stimmen

Für andere, die vorbeikommen, gibt es weitere Informationen zu "here documents": tldp.org/LDP/abs/html/here-docs.html

493voto

Dennis Williamson Punkte 322329

Hier werden Dokumente oft zu diesem Zweck verwendet.

cat << EOF
Verwendung: up [--level | -n ][--help][--version]

Fehler melden an: 
up-Homepage:
EOF

Sie werden in allen Bourne-abgeleiteten Shells unterstützt, einschließlich aller Versionen von Bash.

8 Stimmen

Ja - aber cat ist kein eingebauter Befehl.

14 Stimmen

@MarkReed: Das ist wahr, aber es ist immer verfügbar (außer möglicherweise unter ungewöhnlichen Umständen).

10 Stimmen

+1 Danke. Ich habe read -d '' help <<- EOF ... verwendet, um den mehrzeiligen String in eine Variable zu lesen und dann das Ergebnis ausgegeben.

280voto

Chris Mohr Punkte 3489

Oder du kannst dies tun:

echo "Verwendung: up [--level | -n ][--help][--version]

Fehler melden an: 
up Homepage: "

2 Stimmen

@OliverWeiler: Es wird sogar in Bourne-Shell wie Dash und der Heirloom Bourne Shell funktionieren.

19 Stimmen

Nicht ideal, wenn Sie dies in einer Funktion benötigen, da Sie entweder 1) den String bis ganz nach links in Ihrer Datei ausdrucken müssen oder 2) ihn eingerückt lassen müssen, um ihn mit dem Rest Ihres Codes auszurichten, aber dann werden auch die Einrückungen gedruckt.

4 Stimmen

Funktioniert. Beachten Sie auch die Verwendung von ' (einfachen Anführungszeichen) statt " (doppelten Anführungszeichen), wenn Sie die Interpretation des Strings nicht wünschen. Wenn Sie $something oder something im Ausgabefeld haben möchten, anstatt dass es ersetzt wird.

107voto

Jorge Punkte 1147

Inspiration durch die aufschlussreichen Antworten auf dieser Seite habe ich einen gemischten Ansatz erstellt, den ich für den einfachsten und flexibelsten halte. Was denkst du?

Zuerst definiere ich die Verwendung in einer Variablen, was es mir ermöglicht, sie in verschiedenen Kontexten wiederzuverwenden. Das Format ist sehr einfach, fast WYSIWYG, ohne die Notwendigkeit, Steuerzeichen hinzuzufügen. Dies scheint mir ziemlich portabel zu sein (ich habe es auf MacOS und Ubuntu ausgeführt)

__usage="
Verwendung: $(basename $0) [OPTIONEN]

Optionen:
  -l, --level               Etwas etwas etwas Ebene
  -n, --nnnnn          Etwas etwas etwas n
  -h, --help                   Etwas etwas etwas Hilfe
  -v, --version                Etwas etwas etwas Version
"

Dann kann ich es einfach verwenden als

echo "$__usage"

oder noch besser, beim Parsen von Parametern, kann ich es einfach dort in einer Einzeiler ausgeben:

levelN=${2:?"--level: n ist erforderlich!""${__usage}"}

4 Stimmen

Dies hat bei mir in einem Skript funktioniert, wo die oben genannte Antwort dies nicht tut (ohne Änderung).

6 Stimmen

Dies ist viel sauberer als die Verwendung einer Reihe von Zeichen wie \t und \n, die schwer im Text zu finden sind und sich stark ausweiten, um die Ausgabe stark von dem String im Skript zu unterscheiden.

2 Stimmen

Aus irgendeinem Grund wird bei mir alles in derselben Zeile gedruckt :/

62voto

nhahtdh Punkte 54526

Verwenden Sie die Option -e, dann können Sie das Zeichen für einen neuen Zeilenumbruch mit \n im String ausgeben.

Zum Beispiel:

echo -e "Dies wird die erste Zeile sein \nund dies wird in der zweiten Zeile sein"

8 Stimmen

Diese Man-Pages sind für das systemeigene echo Befehl, /bin/echo, der auf Mac OS keine -e Option hat. Wenn Sie bash auf diesen Systemen verwenden, übernimmt sein integrierter echo Befehl. Sie können dies sehen, indem Sie explizit /bin/echo wasauchimmer eingeben und das unterschiedliche Verhalten beobachten. Um die Dokumentation für den integrierten Befehl zu sehen, geben Sie help echo ein.

1 Stimmen

/bin/echo unterscheidet sich oft von einem Betriebssystem zum anderen und unterscheidet sich von Bash's integriertem echo.

0 Stimmen

@MarkReed: Ich werde es später versuchen, aber danke für die Informationen. +1. Ich lasse einfach meine Antwort hier stehen, da es eine Menge guter Diskussionen gibt.

28voto

Gordon Davisson Punkte 105638

Da ich in einem Kommentar printf empfohlen habe, sollte ich wahrscheinlich einige Beispiele für dessen Verwendung geben (obwohl ich für das Drucken einer Verwendungsnachricht eher die Antworten von Dennis oder Chris verwenden würde). printf ist etwas komplexer zu verwenden als echo. Das erste Argument ist eine Formatzeichenkette, in der Escape-Sequenzen (wie \n) immer interpretiert werden; sie kann auch Formatanweisungen enthalten, die mit % beginnen und kontrollieren, wo und wie zusätzliche Argumente darin eingeschlossen werden. Hier sind zwei verschiedene Ansätze für die Verwendung als Verwendungsnachricht:

Zunächst könnten Sie die gesamte Nachricht in der Formatzeichenkette einschließen:

printf "Verwendung: up [--level | -n ][--help][--version]\n\nFehlerberichte an: \nup Homepage: \n"

Beachten Sie, dass im Gegensatz zu echo das abschließende Zeilenumbruchzeichen explizit eingeschlossen werden muss. Auch wenn die Nachricht zufällig einige %-Zeichen enthält, müssten sie als %% geschrieben werden. Wenn Sie die Bugreport- und Homepage-Adressen einschließen möchten, können sie ganz natürlich hinzugefügt werden:

printf "Verwendung: up [--level | -n ][--help][--version]\n\nFehlerberichte an: %s\nup Homepage: %s\n" "$bugreport" "$homepage"

Zweitens könnten Sie einfach die Formatzeichenkette verwenden, um jede zusätzliche Argument auf einer separaten Zeile zu drucken:

printf "%s\n" "Verwendung: up [--level | -n ][--help][--version]" "" "Fehlerberichte an: " "up Homepage: "

Bei dieser Option ist das Hinzufügen der Bugreport- und Homepage-Adressen ziemlich offensichtlich:

printf "%s\n" "Verwendung: up [--level | -n ][--help][--version]" "" "Fehlerberichte an: $bugreport" "up Homepage: $homepage"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X