Mehrere Zeilen in eine Bash-Variable aufnehmen
Habe ich einen script 'myscript', die Ausgänge sind die folgenden:
abc
def
ghi
in einem anderen Skript, das nenne ich:
declare RESULT=$(./myscript)
sowie $RESULT
bekommt den Wert
abc def ghi
Gibt es eine Möglichkeit, das Ergebnis speichern Sie entweder mit den Zeilenumbrüchen oder '\n' - Zeichen, so kann ich die Ausgabe mit 'echo -e
'?
InformationsquelleAutor der Frage Parker | 2009-03-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tatsächlich, das ERGEBNIS enthält genau das, was Sie wollen — um zu demonstrieren:
Was Sie zeigen, ist, was Sie von:
Wie bereits angemerkt in den Kommentaren, der Unterschied ist, dass (1) die doppelten Anführungszeichen version der Variablen (
echo "$RESULT"
) bewahrt interne Abstand der Wert genau so, wie es dargestellt wird in der variable — Zeilenumbrüche, Tabulatoren, mehrere Leerzeichen und alle — in der Erwägung, dass (2) die nicht börsennotierten version (echo $RESULT
) ersetzt jede Folge von einem oder mehr Leerzeichen, Tabulatoren und Zeilenumbrüche durch Leerzeichen. So (1) bewahrt die Form der input-variable, in der Erwägung, dass (2) erstellt eine potentiell sehr lange single-line-output mit "Worte" getrennt durch einzelne Leerzeichen (wo ein "Wort" ist eine Folge von nicht-whitespace-Zeichen; es müssen nicht sein alphanumerische Zeichen in eines der Wörter).InformationsquelleAutor der Antwort Jonathan Leffler
Ein anderes Problem mit diesem ist, dass Kommando-substitution —
$()
— Streifen nachfolgende Zeilenumbrüche. Wohl nicht immer wichtig, aber wenn Sie wirklich wollen, zu erhalten genauwas ausgegeben wurde, müssen Sie eine andere Linie und einige zitieren:Dies ist besonders wichtig, wenn Sie wollen Griff alle möglich, Dateinamen (zur Vermeidung von undefiniertem Verhalten wie Betriebssystem auf die falsche Datei).
InformationsquelleAutor der Antwort l0b0
Zusätzlich zu der Antwort von @l0b0 ich hatte gerade die situation, wo ich brauchte, um beide halten das abschließende Zeilenumbrüche die Ausgabe durch das Skript und check das script return code.
Und das problem mit l0b0 die Antwort ist, dass das "echo x" war das zurücksetzen $? zurück auf null... so habe ich es geschafft zu kommen mit diesem sehr schlaue Lösung:
InformationsquelleAutor der Antwort Lurchman
Im Falle, dass Sie interessiert sind, in bestimmten Linien, verwenden Sie ein Ergebnis-array:
InformationsquelleAutor der Antwort user2574210
Wie wäre es damit, es werde Lesen Sie jede Zeile auf eine variable und verwendet werden kann, anschließend !
sagen myscript Ausgabe wird in eine Datei umgeleitet genannt myscript_output
InformationsquelleAutor der Antwort Rahul Reddy
Nachdem versucht die meisten der Lösungen hier, die einfachste Sache, die ich fand, war die offensichtliche - mithilfe einer temp-Datei. Ich bin mir nicht sicher, was Sie tun möchten, mit Ihrer multiple-line-Ausgang, aber dann können Sie mit Ihr umgehen zeilenweise mit Lesen. Über die einzige Sache, die Sie nicht wirklich tun, ist einfach kleben Sie es alle in die gleiche variable, aber für die meisten praktischen Zwecke ist diese Art leichter zu behandeln.
Quick hack zu machen, tun die angeforderte Aktion:
Hinweis: dies fügt eine zusätzliche Zeile. Wenn Sie arbeiten, können Sie code, um es, ich bin einfach zu faul.
BEARBEITEN: Während in diesem Fall funktioniert sehr gut, Leute, die dies Lesen sollten sich bewusst sein, dass Sie einfach squash Ihre stdin innerhalb der while-Schleife, so geben Sie ein Skript ausgeführt wird, eine Linie, klare stdin und exit. Wie ssh tun, dass ich denke? Ich sah es vor kurzem, andere code-Beispiele hier: https://unix.stackexchange.com/questions/24260/reading-lines-from-a-file-with-bash-for-vs-while
One more time! Dieses mal mit einem anderen filehandle (stdin, stdout, stderr sind 0-2, so können wir &3 oder höher in der bash).
können Sie auch verwenden, mktemp, aber dies ist nur ein kurzes code-Beispiel. Verwendung für mktemp aussieht:
Dann verwenden Sie $filenamevar wie würden Sie den tatsächlichen Namen der Datei. Wohl nicht erklärt werden müssen hier aber jemand beschwert in den Kommentaren.
InformationsquelleAutor der Antwort user1279741