Tôi đã nhận thấy có hai cách khác nhau để xây dựng các vòng lặp trong zsh :
for x (1 2 3); do echo $x; done
for x in 1 2 3; do echo $x; done
Cả hai đều in:
1
2
3
Câu hỏi của tôi là, tại sao hai cú pháp? Là $x
lặp đi lặp lại thông qua một loại đối tượng khác nhau trong mỗi đối tượng ?
Liệu bash có phân biệt tương tự?
Phụ lục:
Tại sao các công việc sau đây?:
#!/bin/zsh
a=1
b=2
c=5
d=(a b c)
for x in $d; do print $x;done
Nhưng cái này thì không?:
#!/bin/zsh
a=1
b=2
c=5
d=(a b c)
# It complains with "parse error near `$d'"
for x $d; do print $x;done
for i ({0..4..2}) for j ({a..c}) echo "($i,$j)"
= {0,2,4}x{a,b,c}
. Dấu chấm phẩy áp dụng cho vòng lặp ngoài cùng và chuyển hướng áp dụng cho trong cùng, và nếu bạn cần thay đổi điều đó, bạn chỉ cần niềng răng: for i ({0..4..2}) { for j ({a..c}) echo "($i,$j)" } | cat -n
= {1,...,9}*({0,2,4}x{a,b,c})
. Tất nhiên bạn có thể kết hợp các vòng lặp với mở rộng zsh:for i ("("{0..4..2}","{a..c}")") echo $i
for x ($d); do print $x; done
sẽ hoạt động và nó sẽ khớp với cú pháp đầu tiên mà bạn đã liệt kê khi bắt đầu câu hỏi của bạn.