Po pierwsze, zakładam, że użycie lsjest tylko przykładem. Nie można przeanalizować wyniku lsw ż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 lspolecenia jest
hello world
wibble
następnie files=($(ls))ustawia filesukład zawiera elementy 3: hello, worldi 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 sflagi, np. "${(@s:,:)…}"Do dzielenia przecinków; fflag 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ż $filesusuwa ona puste elementy (tutaj nie ma to znaczenia, ponieważ elementy nie będą puste).
print $finterpretuje $fjako przełącznik, jeśli zaczyna się od a, -i rozszerza ukośniki odwrotne $f. Użyj print -r -- $flub, print -rn -- $fjeśli nie chcesz dodawać nowego wiersza po ciągu.