Ich möchte einige vordefinierte Texte in eine Datei schreiben, die Folgendes enthält:
text="this is line one\n
this is line two\n
this is line three"
echo -e $text > filename
Ich erwarte so etwas:
this is line one
this is line two
this is line three
Aber hab das:
this is line one
this is line two
this is line three
Ich bin mir sicher, dass nach jedem kein Platz mehr vorhanden ist \n
, aber wie kommt der zusätzliche Platz heraus?
text="this is line one\nthis is line two\nthis is line three"
dieselbe Zeile eingeben würden? (ohne Eingabe)\n
in jeder Zeile, Sie haben bereits die neue Zeile gedrückt, um zur neuen Zeile zu wechseln\n
. Warum setzen Sie die nächste Zeile in eine neue Zeile? Einfachtext="this is line one\nthis is line two\nthis is line three"
\n
am Ende jeder Zeile entfernen , werden alle Ausgaben zusammen in einer einzelnen Zeile ausgeführt."$text"
ist entscheidend, doppelte Anführungszeichen in die Echolinie zu setzen. Ohne sie funktioniert keine der Zeilenumbrüche (sowohl wörtlich als auch '\ n'). Mit ihnen tun sie alle.Antworten:
Heredoc klingt für diesen Zweck bequemer. Es wird verwendet, um mehrere Befehle an ein Befehlsinterpreterprogramm wie ex oder cat zu senden
Die Zeichenfolge danach
<<
gibt an, wo angehalten werden soll.Verwenden Sie zum Senden dieser Zeilen an eine Datei:
Sie können diese Zeilen auch in einer Variablen speichern:
Dadurch werden die Zeilen in der benannten Variablen gespeichert
VAR
.Beachten Sie beim Drucken die Anführungszeichen um die Variable, da sonst die Zeilenumbruchzeichen nicht angezeigt werden.
Noch besser ist, dass Sie Einrückungen verwenden können, um sie in Ihrem Code besser hervorzuheben. Fügen Sie diesmal einfach ein
-
Nachher hinzu<<
, um zu verhindern, dass die Registerkarten angezeigt werden.Dann müssen Sie jedoch Tabulatoren und keine Leerzeichen zum Einrücken in Ihren Code verwenden.
quelle
-d
Option inread -r -d '' VARIABLE <<- EOM
hat bei mir nicht funktioniert.Wenn Sie versuchen, den String in eine Variable zu bringen, ist ein anderer einfacher Weg wie folgt:
Wenn Sie Ihre Zeichenfolge mit Tabulatoren (dh '\ t') einrücken, wird die Einrückung entfernt. Wenn Sie mit Leerzeichen einrücken, bleibt die Einrückung in.
HINWEIS: Es ist wichtig, dass sich die letzte schließende Klammer in einer anderen Zeile befindet. Der
END
Text muss in einer eigenen Zeile erscheinen.quelle
)
derselben Zeile. Ich denke, das liegt daran, dass das, was dazwischen liegt$(
und)
in seinem eigenen Universum ausgeführt wird, und der eigentliche Befehl ')' sowieso nicht sieht. Ich frage mich, ob es auch für andere funktioniert.echo
Fügt Leerzeichen zwischen den übergebenen Argumenten ein.$text
unterliegt einer variablen Erweiterung und Wortaufteilung, daher entspricht Ihrecho
Befehl:Sie können sehen, dass vor "this" ein Leerzeichen hinzugefügt wird. Sie können entweder die Zeilenumbruchzeichen entfernen und zitieren
$text
, um die Zeilenumbrüche beizubehalten:Oder Sie könnten verwenden
printf
, das robuster und tragbarer ist alsecho
:In
bash
, das die Erweiterung der Zahnspange unterstützt, können Sie sogar Folgendes tun:quelle
In einem Bash-Skript funktioniert Folgendes:
Alternative:
Katze Dateiname gibt:
quelle
-e
Option für vergessenecho
. Bitte versuche es erneut.Ich habe mehr Lösungen gefunden, da ich wollte, dass jede Zeile richtig eingerückt wird:
Sie können verwenden
echo
:Es funktioniert nicht, wenn Sie
"\n"
kurz zuvor\
am Ende einer Zeile setzen.Alternativ können Sie
printf
für eine bessere Portabilität verwenden (ich hatte zufällig viele Probleme mitecho
):Eine weitere Lösung könnte sein:
oder
Eine andere Lösung wird durch Mischen von
printf
und erreichtsed
.Es ist nicht einfach, so formatierten Code umzugestalten, wenn Sie die Einrückungsstufe in den Code fest codieren.
Es ist möglich, eine Hilfsfunktion und einige Tricks zur variablen Substitution zu verwenden:
quelle
Das Folgende ist meine bevorzugte Methode, um einer Variablen eine mehrzeilige Zeichenfolge zuzuweisen (ich finde, sie sieht gut aus).
Die Anzahl der Unterstriche ist in beiden Fällen gleich (hier 80).
quelle
Nur um eine einfache einzeilige Verkettung zu erwähnen, da sie manchmal nützlich sein kann.
Sie werden so etwas bekommen
Alle führenden und endenden Leerzeichen bleiben für erhalten
quelle
Es gibt viele Möglichkeiten, dies zu tun. Für mich funktioniert es gut , die eingerückte Saite in sed zu leiten.
Diese Antwort basierte auf der Antwort von Mateusz Piotrowski , wurde aber etwas verfeinert.
quelle
es wird funktionieren, wenn Sie es wie folgt setzen:
quelle