Po pierwsze, zakładam, że użycie ls
jest tylko przykładem. Nie można przeanalizować wyniku ls
w żadnej powłoce, ponieważ jest ona niejednoznaczna. Przeczytaj, dlaczego nie powinieneś analizować danych wyjściowych ls (1), jeśli jest to dla Ciebie wiadomość. W dowolnej powłoce, aby uzyskać listę plików, użyj symboli wieloznacznych, np files=(*)
.
W Zsh, podobnie jak w innych powłokach, wynik podstawienia polecenia jest dzielony na słowa w białych znakach (a dokładniej, zgodnie z wartością IFS
). (W przeciwieństwie do innych powłok wynik podstawienia polecenia nie podlega globowaniu w zsh.) Więc jeśli wynikiem ls
polecenia jest
hello world
wibble
następnie files=($(ls))
ustawia files
układ zawiera elementy 3: hello
, world
i wibble
.
Jeśli podstawienie polecenia jest w podwójnym cudzysłowie, nie jest wykonywane dzielenie. Można wykonać podział niestandardowy za pomocą flag rozwijania parametrów . Użyj @
flagi, aby wskazać, że wynikiem podziału ma być tablica (co dziwne, musisz zachować rozwinięcie w podwójnych cudzysłowach, tj. "${(@)…}"
Nawet jeśli ciąg podwójnego cudzysłowu rozwinie się do wielu słów). Do podziału używaj s
flagi, np. "${(@s:,:)…}"
Do dzielenia przecinków; f
flag dzieli się tylko znakami nowej linii.
files=("${(@f)$(ls)}")
Zauważ, że właściwym sposobem na iterację tablicy jest ogólnie for f in $files[@]
, ponieważ $files
usuwa ona puste elementy (tutaj nie ma to znaczenia, ponieważ elementy nie będą puste).
print $f
interpretuje $f
jako przełącznik, jeśli zaczyna się od a, -
i rozszerza ukośniki odwrotne $f
. Użyj print -r -- $f
lub, print -rn -- $f
jeśli nie chcesz dodawać nowego wiersza po ciągu.