Zunächst gehe ich davon aus, dass die Verwendung von lsnur ein Beispiel ist. Sie können die Ausgabe lsin keiner Shell analysieren , da sie nicht eindeutig ist. Lesen Sie, warum Sie die Ausgabe von ls (1) nicht analysieren sollten, wenn dies für Sie neu ist. Verwenden Sie in einer beliebigen Shell Platzhalter, um eine Liste der Dateien zu erhalten, z files=(*).
In zsh wird das Ergebnis der Befehlssubstitution wie in anderen Shells in Wörter mit Leerzeichen aufgeteilt (genauer gesagt entsprechend dem Wert von IFS). (Im Gegensatz zu anderen Shells unterliegt das Ergebnis der Befehlssubstitution nicht dem Globbing in zsh.) Wenn also die Ausgabe des lsBefehls lautet
hello world
wibble
files=($(ls))Legt dann fest , dass das filesArray 3 Elemente enthält : hello, worldund wibble.
Wenn die Befehlsersetzung in doppelte Anführungszeichen steht, wird keine Aufteilung durchgeführt. Sie können eine benutzerdefinierte Aufteilung mit Parametererweiterungsflags durchführen . Verwenden Sie das @Flag, um anzuzeigen, dass das Ergebnis der Aufteilung ein Array sein soll (seltsamerweise müssen Sie die Erweiterung in doppelte Anführungszeichen setzen, dh "${(@)…}"obwohl die Zeichenfolge in doppelten Anführungszeichen auf mehrere Wörter erweitert wird). Verwenden Sie zum Teilen das sFlag, z. B. "${(@s:,:)…}"um durch Kommas zu teilen. Die fFlagge wird nur bei Zeilenumbrüchen geteilt.
files=("${(@f)$(ls)}")
Beachten Sie, dass die richtige Methode zum Durchlaufen eines Arrays im Allgemeinen darin besteht for f in $files[@], $filesleere Elemente zu entfernen (hier spielt es keine Rolle, da die Elemente nicht leer sind).
print $fwird $fals Schalter interpretiert , wenn er mit a beginnt -und Backslashes in erweitert $f. Verwenden Sie print -r -- $foder, print -rn -- $fwenn Sie nach der Zeichenfolge keine neue Zeile hinzufügen möchten.