Ich dachte, das Folgende würde die Ausgabe von my_command
in einem Array von Zeilen gruppieren :
IFS='\n' array_of_lines=$(my_command);
Das $array_of_lines[1]
würde sich auf die erste Zeile in der Ausgabe von my_command
, $array_of_lines[2]
auf die zweite und so weiter beziehen .
Der obige Befehl scheint jedoch nicht gut zu funktionieren. Es scheint auch die Ausgabe von my_command
um das Zeichen zu teilen n
, wie ich mit überprüft habe print -l $array_of_lines
, die ich glaube, druckt Elemente eines Arrays Zeile für Zeile. Ich habe dies auch überprüft mit:
echo $array_of_lines[1]
echo $array_of_lines[2]
...
In einem zweiten Versuch dachte ich, das Hinzufügen eval
könnte helfen:
IFS='\n' array_of_lines=$(eval my_command);
aber ich habe genau das gleiche Ergebnis wie ohne.
Schließlich habe ich nach der Antwort auf Listenelemente mit Leerzeichen in zsh auch versucht, Parametererweiterungsflags zu verwenden, anstatt IFS
zsh mitzuteilen, wie die Eingabe aufgeteilt und die Elemente in einem Array gesammelt werden sollen, dh:
array_of_lines=("${(@f)$(my_command)}");
Aber ich habe immer noch das gleiche Ergebnis (Spaltung passiert am n
)
Damit habe ich folgende Fragen:
Q1. Was sind die "richtigen" Möglichkeiten, um die Ausgabe eines Befehls in einem Array von Zeilen zu sammeln?
Q2. Wie kann ich festlegen IFS
, dass nur Zeilenumbrüche geteilt werden?
Q3. Wenn ich Parametererweiterungsflags wie in meinem dritten Versuch oben (dh mithilfe von @f
) verwende, um die Aufteilung festzulegen, ignoriert zsh dann den Wert von IFS
? Warum hat es oben nicht funktioniert?
quelle
"${(@f)...}"
ist das gleiche wie${(f)"..."}
, aber auf andere Weise.(@)
in doppelten Anführungszeichen bedeutet "Ergib ein Wort pro Array-Element" und(f)
bedeutet "durch Zeilenumbruch in ein Array aufteilen". PS: Bitte verlinken Sie zu den Dokumenten${(f)"..."}
würde leere Zeilen überspringen, behält"${(@f)...}"
sie bei. Das ist der gleiche Unterschied zwischen$argv
und"$argv[@]"
. Das"$@"
Ding, um alle Elemente eines Arrays zu erhalten, stammt aus der Bourne-Shell in den späten 70ern.Zwei Probleme: Erstens interpretieren doppelte Anführungszeichen anscheinend auch keine Backslash-Escapes (Entschuldigung :). Verwenden Sie
$'...'
Anführungszeichen. Und nachman zshparam
, zu sammeln Wörter in einem Array müssen Sie sie in Klammern einzuschließen. Das funktioniert also:Ich kann dein Q3 nicht beantworten. Ich hoffe, ich muss nie so esoterische Dinge wissen :).
quelle
Sie können auch tr verwenden, um newline durch Leerzeichen zu ersetzen:
quelle
$IFS
. Eine Übersetzung in die andere macht keinen Unterschied.echo
, dass alle Eingaben mehr oder weniger eine Häufung von Wörtern sind, die durch wen es interessiert, getrennt sind.