Wie kann ich eine Multipline-Zeichenfolge in Bash ausgeben, ohne mehrere Echoaufrufe wie folgt zu verwenden:
echo "usage: up [--level <n>| -n <levels>][--help][--version]"
echo
echo "Report bugs to: "
echo "up home page: "
Ich suche nach einer tragbaren Möglichkeit, dies zu tun, indem ich nur Bash-Builtins verwende.
echo >&2 ...
--help
(die zum Standardausgang gehen sollte).printf
basierte Lösung von Gordon Davidson. Obwohl es im Schatten derecho
oder dercat
basierten Ansätze steht, scheint es viel weniger ein Kludge zu sein. Zugegeben, die "printf" -Syntax stellt eineAntworten:
Hier werden häufig Dokumente zu diesem Zweck verwendet.
Sie werden in allen von Bourne abgeleiteten Shells unterstützt, einschließlich aller Versionen von Bash.
quelle
cat
nicht eingebaut.read -d '' help <<- EOF ...
den mehrzeiligen String in eine Variable eingelesen und dann das Ergebnis wiedergegeben.oder Sie können dies tun:
quelle
Inspiriert von den aufschlussreichen Antworten auf dieser Seite habe ich einen gemischten Ansatz entwickelt, den ich für den einfachsten und flexibleren halte. Was denken Sie?
Zunächst definiere ich die Verwendung in einer Variablen, sodass ich sie in verschiedenen Kontexten wiederverwenden kann. Das Format ist sehr einfach, fast WYSIWYG, ohne dass Steuerzeichen hinzugefügt werden müssen. Dies scheint mir ziemlich portabel zu sein (ich habe es unter MacOS und Ubuntu ausgeführt)
Dann kann ich es einfach als verwenden
oder noch besser, wenn ich Parameter analysiere, kann ich es dort einfach in einem Einzeiler wiedergeben:
quelle
echo "$__usage"
Für mich war es notwendig, doppelte Anführungszeichen zu verwenden .echo $__usage
funktioniert nicht.Verwenden Sie die
-e
Option, dann können Sie ein neues Zeilenzeichen mit\n
in der Zeichenfolge drucken .Probe (aber nicht sicher, ob eine gute oder nicht)
Das Schöne ist, dass diese-e
Option nicht in der Manpage von MacOS dokumentiert ist, solange sie noch verwendet werden kann. Es ist in der Manpage von Linux dokumentiert .quelle
echo
Befehl vorgesehen/bin/echo
, für den unter Mac OS keine-e
Option verfügbar ist . Wenn Sie Bash auf diesen Systemen verwenden,echo
übernimmt der integrierte Befehl. Sie können dies sehen, indem Sie/bin/echo whatever
den Unterschied im Verhalten explizit eingeben und beobachten. Geben Sie Folgendes ein, um die Dokumentation für das integrierte Gerät anzuzeigenhelp echo
./bin/echo
unterscheidet sich oft von Betriebssystem zu Betriebssystem und von Bashs integriertem Betriebssystemecho
.echo -e
ist nicht portierbar - einige Echo-Implementierungen geben beispielsweise das "-e" als Teil der Ausgabe aus. Wenn Sie Portabilität wünschen, verwenden Sie stattdessen printf. Dies tut beispielsweise / bin / echo unter OS X 10.7.4. IIRC das eingebaute Bash-Echo war auch unter 10.5.0 seltsam, aber ich erinnere mich nicht mehr an die Details.echo -e
hat mich schon mal gebissen ... Auf jeden Fall benutzenprintf
odercat
mit einem Heredoc. Die<<-
Variante dieser Dokumente ist besonders schön, da Sie führende Einrückungen in der AusgabeDa ich
printf
in einem Kommentar empfohlen habe , sollte ich wahrscheinlich einige Beispiele für seine Verwendung nennen (obwohl ich zum Drucken einer Verwendungsnachricht eher Dennis 'oder Chris' Antworten verwenden würde).printf
ist etwas komplexer zu bedienen alsecho
. Das erste Argument ist eine Formatzeichenfolge, in der Escapezeichen (wie\n
) immer interpretiert werden. Es kann auch Formatanweisungen enthalten%
, die damit beginnen , welche und wo zusätzliche Argumente darin enthalten sind. Hier sind zwei verschiedene Ansätze, um es für eine Verwendungsnachricht zu verwenden:Zunächst können Sie die gesamte Nachricht in die Formatzeichenfolge aufnehmen:
Beachten Sie, dass Sie im Gegensatz
echo
dazu die letzte neue Zeile explizit einfügen müssen. Wenn die Nachricht%
Zeichen enthält, müssen diese als geschrieben werden%%
. Wenn Sie die Fehlerbericht- und Homepage-Adressen angeben möchten, können diese ganz natürlich hinzugefügt werden:Zweitens können Sie einfach die Formatzeichenfolge verwenden, um jedes zusätzliche Argument in einer separaten Zeile zu drucken:
Mit dieser Option ist das Hinzufügen der Bugreport- und Homepage-Adressen ziemlich offensichtlich:
quelle
Auch mit eingerücktem Quellcode können Sie
<<-
(mit einem nachgestellten Bindestrich) führende Tabulatoren (aber keine führenden Leerzeichen) ignorieren. Zum Beispiel dies:Gibt eingerückten Text ohne das führende Leerzeichen aus:
quelle
Wenn Sie die Lösung von @jorge verwenden und feststellen, dass sich alles in derselben Zeile befindet, stellen Sie sicher, dass Sie die Variable in Anführungszeichen setzen:
druckt alles in einer Zeile während
behält die Zeilenumbrüche bei.
quelle
cat <<EOF .... EOF