Đầu tiên, tôi cho rằng việc sử dụng ls
chỉ là một ví dụ. Bạn không thể phân tích đầu ra của ls
bấ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 ls
lệnh là
hello world
wibble
sau đó files=($(ls))
đặt files
mảng để chứa 3 yếu tố: hello
, world
và 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 s
cờ, ví dụ "${(@s:,:)…}"
để phân tách tại dấu phẩy; các f
lá 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[@]
, $files
loạ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 $f
diễn giải $f
như 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 -- $f
hoặc print -rn -- $f
nếu bạn không muốn thêm một dòng mới sau chuỗi.