Zunächst gehe ich davon aus, dass die Verwendung von ls
nur ein Beispiel ist. Sie können die Ausgabe ls
in 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 ls
Befehls lautet
hello world
wibble
files=($(ls))
Legt dann fest , dass das files
Array 3 Elemente enthält : hello
, world
und 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 s
Flag, z. B. "${(@s:,:)…}"
um durch Kommas zu teilen. Die f
Flagge 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[@]
, $files
leere Elemente zu entfernen (hier spielt es keine Rolle, da die Elemente nicht leer sind).
print $f
wird $f
als Schalter interpretiert , wenn er mit a beginnt -
und Backslashes in erweitert $f
. Verwenden Sie print -r -- $f
oder, print -rn -- $f
wenn Sie nach der Zeichenfolge keine neue Zeile hinzufügen möchten.
(…)
sind notwendig, damit es sichfiles
um ein Array und nicht um eine Zeichenfolge handelt (die die Verkettung der Zeilen aus dem Befehl enthalten würde, wodurch die von vorgenommene Aufteilung rückgängig gemacht wird(f)
). 2. Mitfoo=$'one\n\nthree', contrast
print -rl $ {(f) foo} `undprint "${(@f)foo}"
. Die doppelten Anführungszeichen werden benötigt, um leere Zeilen beizubehalten, die Sie nicht erhalten,ls
aber mit anderen Befehlen passieren können.In zsh können Sie die Erweiterung der Shell verwenden, die standardmäßig keine Wortteilung durchführt. Versuchen
quelle