Ich schreibe ein Installationsskript, das als ausgeführt wird /bin/sh
.
Eine Zeile fordert zur Eingabe einer Datei auf:
read -p "goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n] " REPLY
Ich möchte diese lange Zeile in viele Zeilen aufteilen, damit keine mehr als 80 Zeichen enthält. Ich spreche über die Zeilen im Quellcode des Skripts; nicht über die Zeilen, die beim Ausführen des Skripts tatsächlich auf dem Bildschirm gedruckt werden sollen!
Was ich versucht habe:
Frist Ansatz:
read -p "goat can try change directory if cd fails to do so. " \ "Would you like to add this feature? [Y|n] " REPLY
Dies funktioniert nicht, da nicht gedruckt wird
Would you like to add this feature? [Y|n]
.Zweiter Ansatz:
echo "goat can try change directory if cd fails to do so. " \ "Would you like to add this feature? [Y|n] " read REPLY
Funktioniert nicht so gut. Nach der Eingabeaufforderung wird eine neue Zeile gedruckt. Das Hinzufügen einer
-n
Optionecho
hilft nicht: Es wird nur gedruckt:-n goat can try change directory if cd fails to do so. Would you like to add this feature? [Y|n] # empty line here
Meine aktuelle Problemumgehung ist
printf '%s %s ' \ "goat can try change directory if cd fails to do so." \ "Would you like to add this feature? [Y|n] " read REPLY
und ich frage mich, ob es einen besseren Weg gibt.
Denken Sie daran, dass ich nach einer /bin/sh
kompatiblen Lösung suche .
shell
shell-script
string
newlines
bourne-shell
Mateusz Piotrowski
quelle
quelle
Antworten:
Koppeln wir zunächst den Lesevorgang mit einer Variablen von der Textzeile ab:
Auf diese Weise ergibt sich das Problem: So weisen Sie einer Variablen zwei Zeilen zu.
Ein erster Versuch dazu ist natürlich:
So geschrieben,
a
erhält die Variable tatsächlich den Wertline-1 line-2
.Aber Sie mögen nicht den Mangel an Einrückungen, den dies erzeugt, na ja, dann können wir versuchen, die Zeilen von einem Here-Doc in den Var einzulesen (beachten Sie, dass die eingerückten Zeilen innerhalb des Here-Doc einen Tabulator benötigen, keine Leerzeichen, richtig arbeiten):
Das würde aber scheitern, da eigentlich zwei Zeilen geschrieben werden
$a
. Eine Problemumgehung, um nur eine Zeile abzurufen, könnte sein:Das ist naheliegend, wirft aber noch weitere Probleme auf.
Richtige Lösung.
Alle oben genannten Versuche machen dieses Problem nur komplexer, als es sein muss.
Ein sehr grundlegender und einfacher Ansatz ist:
Der Code für Ihr spezielles Beispiel lautet (für jede Shell, deren
read
Unterstützung-p
):Für alle anderen Shells verwenden Sie:
quelle
Der Backslash am Ende der Zeilen ermöglicht die Fortsetzung des Befehls über mehrere Zeilen, nicht über tatsächliche Zeilenumbrüche in der Ausgabe.
So wird beispielsweise Ihr erster Ansatz zum Befehl
Ich bin nicht sicher, warum Sie lesen möchten, um mehrere Zeilen auszugeben, aber ich würde einfach
read
für die Eingabeaufforderungszeile undecho
die vorhergehenden Zeilen verwenden.Um den Code über mehrere Zeilen lesbarer zu machen, schließen / öffnen Sie Ihre Anführungszeichen nicht zwischen den Zeilen.
Versuche dies:
quelle
read
innerhalb einer Funktion eingerückt ist, scheint Ihr Ansatz die Lesbarkeit zu beeinträchtigen.Ich finde, @ BinaryZebras Ansatz , eine Variable zu verwenden, ist sauberer, aber Sie können es auch so machen, wie Sie es versucht haben. Sie müssen nur die Zeilenumbrüche in den Anführungszeichen belassen:
quelle
\n
mich in meine Eingabeaufforderung einzufügen . Ich wollte den Code nur in mehrere Zeilen aufteilen, damit jede Zeile höchstens 80 Zeichen lang ist.Was ist nur damit:
quelle