Wie werden Zeilenumbrüche beim Speichern der Befehlsausgabe in einer Variablen beibehalten?


102

Ich benutze Bash Shell unter Linux. Ich habe dieses einfache Skript ...

#!/bin/bash

TEMP=`sed -n '/'"Starting deployment of"'/,/'"Failed to start context"'/p' "/usr/java/jboss/standalone/log/server.log" | tac | awk '/'"Starting deployment of"'/ {print;exit} 1' | tac`
echo $TEMP

Wenn ich dieses Skript jedoch ausführe

./temp.sh

Die gesamte Ausgabe wird ohne Wagenrücklauf / neue Zeilen gedruckt. Ich bin mir nicht sicher, ob ich die Ausgabe auf diese Weise in $ TEMP oder im Echo-Befehl selbst speichere.

Wie speichere ich die Ausgabe des Befehls in einer Variablen und behalte die Zeilenumbrüche / Zeilenumbrüche bei?


3
Sie werden in der Variablen ganz gut beibehalten (mit Ausnahme der letzten); Es ist dein Echo, das gebrochen ist. Siehe mywiki.wooledge.org/BashPitfalls Eintrag # 14
Charles Duffy

1
auch, don'tspeichern commandsin variables. Useein functionstattdessen
Han Solo

Antworten:


202

Zitieren Sie Ihre Variablen. Hier ist es warum:

$ f="fafafda
> adffd
> adfadf
> adfafd
> afd"

$ echo $f
fafafda adffd adfadf adfafd afd

$ echo "$f"
fafafda
adffd
adfadf
adfafd
afd

Ohne Anführungszeichen wird die Shell $TEMPdurch die darin enthaltenen Zeichen ersetzt (eines davon ist eine neue Zeile). Bevor Sie die echoShell aufrufen , wird diese Zeichenfolge mithilfe des Internal Field Separator(IFS) in mehrere Argumente aufgeteilt und die resultierende Liste der Argumente an übergeben echo. Standardmäßig IFSist das Leerzeichen (Leerzeichen, Tabulatoren und Zeilenumbrüche) festgelegt, sodass die Shell Ihre $TEMPZeichenfolge in Argumente zerlegt und die neue Zeile nie sieht, da die Shell sie wie ein Leerzeichen als Trennzeichen betrachtet.


xdotool type "$myVar"funktioniert nicht Es gibt immer noch den Inhalt der Variablen ohne neue Zeilen ein
Azerafati

Was ist, wenn Sie wollen , wie etwas zu tun FOO="$(echo $VAR)"; Wie zitieren Sie $VARrichtig, wenn es bereits in Anführungszeichen steht?
weberc2

@ weberc2 Du zitierst es einfach noch einmal : "$(echo "$VAR")". Ja, es ist seltsam zu analysieren, aber anscheinend einfacher für Muscheln als für uns.
OJFord

3

Ich bin auf das gleiche Problem gestoßen, ein Zitat wird helfen

ubuntu@host:~/apps$ apps="abc
> def"
ubuntu@host:~/apps$ echo $apps
abc def
ubuntu@host:~/apps$ echo "$apps"
abc
def

1
Es ist keine gute Idee, eine Frage fast 5 Jahre später zu beantworten, ohne den vorherigen Antworten neue Details hinzuzufügen oder eine neue Lösung bereitzustellen. Bitte vermeiden Sie es, solche Antworten zu veröffentlichen.
MAChitgarha
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.