Wie benutzt man Bash-Fortsetzungslinien?
Mir ist klar, dass Sie dies tun können:
echo "continuation \
lines"
>continuation lines
Wenn Sie jedoch Code eingerückt haben, funktioniert dies nicht so gut:
echo "continuation \
lines"
>continuation lines
bash
line
indentation
PyRulez
quelle
quelle
Antworten:
Dies ist, was Sie vielleicht wollen
Wenn dadurch zwei Argumente für das Echo erstellt werden und Sie nur eines möchten, sehen wir uns die Verkettung von Zeichenfolgen an. Wenn Sie in bash zwei Zeichenfolgen nebeneinander platzieren, verketten Sie:
Eine Fortsetzungszeile ohne Einzug ist also eine Möglichkeit, eine Zeichenfolge aufzubrechen:
Aber wenn ein Einzug verwendet wird:
Sie erhalten zwei Argumente, da dies keine Verkettung mehr ist.
Wenn Sie eine einzelne Zeichenfolge möchten, die Linien kreuzt, während Sie diese Leerzeichen einrücken, aber nicht erhalten, können Sie versuchen, die Fortsetzungslinie zu löschen und Variablen zu verwenden:
Auf diese Weise können Sie Code auf Kosten zusätzlicher Variablen sauber einrücken. Wenn Sie die Variablen lokalisieren, sollte dies nicht zu schlecht sein.
quelle
s="string no. 1" s+="string no. 2" s+=" string no. 3" echo "$s"
Hier eignen sich Dokumente mit dem
<<-HERE
Terminator gut für eingerückte mehrzeilige Textzeichenfolgen. Es werden alle führenden Registerkarten aus dem Dokument hier entfernt. (Leitungsterminatoren bleiben jedoch weiterhin bestehen.)Siehe auch http://ss64.com/bash/syntax-here.html
Wenn Sie einige, aber nicht alle führenden Leerzeichen beibehalten müssen, können Sie so etwas wie verwenden
oder vielleicht verwenden
tr
, um Zeilenumbrüche loszuwerden:(Die zweite Zeile enthält eine Registerkarte und ein Leerzeichen vorne. Die Registerkarte wird vom Bindestrich-Operator vor dem Heredoc-Terminator entfernt, während das Leerzeichen erhalten bleibt.)
Um lange komplexe Zeichenfolgen über viele Zeilen zu wickeln, mag ich
printf
:Es funktioniert auch gut in Kontexten, in denen Sie nicht triviale Teile des Shell-Skripts in eine andere Sprache einbetten möchten, in der Sie aufgrund der Syntax der Host-Sprache kein Here-Dokument verwenden können, z. B. in einem
Makefile
oderDockerfile
.quelle
printf
Beispiel auch jetzt.)Sie können Bash-Arrays verwenden
dann
Es gibt einen zusätzlichen Platz, weil (nach dem Bash-Handbuch):
So setzt
IFS=''
mehr Platz , um loszuwerden ,quelle
In bestimmten Szenarien kann es sinnvoll sein, die Verkettungsfähigkeit von Bash zu nutzen.
Beispiel:
Aus dem Abschnitt PARAMETER der Bash Man-Seite:
quelle
Ich stieß auf eine Situation, in der ich als Teil eines Befehlsarguments eine lange Nachricht senden und die Zeilenlängenbeschränkung einhalten musste. Die Befehle sehen ungefähr so aus:
Die Art und Weise, wie ich dies gelöst habe, besteht darin, die Nachricht als hier-Dokument zu verschieben (wie von @tripleee vorgeschlagen). Aber ein hier-Dokument wird zu einem Standard, daher muss es wieder eingelesen werden. Ich habe den folgenden Ansatz gewählt:
Dies hat den Vorteil, dass
$message
genau wie die Zeichenfolgenkonstante ohne zusätzliche Leerzeichen oder Zeilenumbrüche verwendet werden kann.Beachten Sie, dass den tatsächlichen obigen Nachrichtenzeilen
tab
jeweils ein Zeichen vorangestellt ist , das von diesem Dokument selbst entfernt wird (aufgrund der Verwendung von<<-
). Am Ende befinden sich noch Zeilenumbrüche, die dann durchdd
Leerzeichen ersetzt werden.Beachten Sie auch, dass, wenn Sie keine Zeilenumbrüche entfernen, diese unverändert angezeigt werden, wenn sie
"$message"
erweitert werden. In einigen Fällen können Sie das Problem möglicherweise umgehen, indem Sie die doppelten Anführungszeichen entfernen.$message
Die Nachricht ist jedoch kein einzelnes Argument mehr.quelle
Zeilenfortsetzungen können auch durch geschickte Verwendung der Syntax erreicht werden.
Im Fall von
echo
:Im Fall von Vars:
Ein anderer Ansatz bei Vars:
Voila!
quelle
Sie können es einfach wie in der Einrückung wie folgt mit Zeilenumbrüchen (ohne Backslash) trennen und einfach neue Zeilen entfernen.
Beispiel:
Wenn es sich um eine variable Definition handelt, werden Zeilenumbrüche automatisch in Leerzeichen konvertiert. Entfernen Sie daher nur zusätzliche Leerzeichen, falls zutreffend.
quelle
Dies ist nicht genau das, was der Benutzer gefragt hat, aber eine andere Möglichkeit, eine lange Zeichenfolge zu erstellen, die mehrere Zeilen umfasst, besteht darin, sie schrittweise aufzubauen, wie folgt:
In diesem Fall wäre es natürlich einfacher gewesen, es auf einmal zu erstellen, aber dieser Stil kann bei längeren Saiten sehr leicht und verständlich sein.
quelle
Versuchen Sie es mit einfachen Anführungszeichen und verketten Sie die Zeichenfolgen:
Hinweis: Die Verkettung enthält ein Leerzeichen.
quelle
echo
wenn Sie hättenx=
, würden Sie die Fehlermeldung erhalten :lines: command not found
.Abhängig davon, welche Art von Risiken Sie akzeptieren und wie gut Sie die Daten kennen und ihnen vertrauen, können Sie eine vereinfachte Variableninterpolation verwenden.
quelle
Dies beantwortet Ihre Frage wahrscheinlich nicht wirklich, aber Sie finden sie möglicherweise trotzdem nützlich.
Der erste Befehl erstellt das Skript, das vom zweiten Befehl angezeigt wird.
Der dritte Befehl macht dieses Skript ausführbar.
Der vierte Befehl enthält ein Verwendungsbeispiel.
Beachten Sie, dass es sinnvoller ist, das ausführbare Skript
~/bin
so zu verschieben, dass es sich in Ihrem Pfad befindet , wenn Sie dieses Skript wirklich verwenden möchten .Überprüfen Sie die Python-Referenz auf Details zur Funktionsweise
textwrap.dedent
.Wenn die Verwendung von
$'...'
oder"$(...)"
für Sie verwirrend ist, stellen Sie eine andere Frage (eine pro Konstrukt), falls noch keine vorhanden ist. Es kann hilfreich sein, einen Link zu der Frage bereitzustellen, die Sie finden / stellen, damit andere Personen eine verknüpfte Referenz haben.quelle