Đầu tiên, tôi cho rằng việc sử dụng lschỉ là một ví dụ. Bạn không thể phân tích đầu ra của lsbất kỳ shell nào, vì nó không rõ ràng. Đọc tại sao bạn không nên phân tích đầu ra của ls (1) nếu đây là tin tức với bạn. Trong bất kỳ shell nào, để có được danh sách các tệp, hãy sử dụng ký tự đại diện, vd files=(*).
Trong zsh, giống như trong các shell khác, kết quả của việc thay thế lệnh được chia thành các từ ở các ký tự khoảng trắng (chính xác hơn, theo giá trị của IFS). (Không giống như các shell khác, kết quả của việc thay thế lệnh không phải là đối tượng toàn cầu trong zsh.) Vì vậy, nếu đầu ra của lslệnh là
hello world
wibble
sau đó files=($(ls))đặt filesmảng để chứa 3 yếu tố: hello, worldvà wibble.
Nếu thay thế lệnh là trong dấu ngoặc kép, thì không có sự phân tách nào được thực hiện. Bạn có thể thực hiện phân tách tùy chỉnh với cờ mở rộng tham số . Sử dụng @cờ để chỉ ra rằng kết quả của việc phân tách là một mảng (kỳ lạ, bạn cần giữ sự mở rộng trong dấu ngoặc kép, nghĩa là "${(@)…}", mặc dù chuỗi trích dẫn kép sẽ mở rộng thành nhiều từ). Để phân tách, sử dụng scờ, ví dụ "${(@s:,:)…}"để phân tách tại dấu phẩy; các flá cờ chia tách chỉ dòng mới.
files=("${(@f)$(ls)}")
Lưu ý rằng cách thích hợp để lặp lại trên một mảng nói chung là for f in $files[@], $filesloại bỏ các phần tử trống (ở đây, điều đó không quan trọng vì các phần tử sẽ không trống).
print $fdiễn giải $fnhư một công tắc nếu nó bắt đầu bằng một -và mở rộng dấu gạch chéo ngược trong $f. Sử dụng print -r -- $fhoặc print -rn -- $fnếu bạn không muốn thêm một dòng mới sau chuỗi.