Mục đích của từ khóa do do ốp trong Bash cho các vòng lặp là gì?


76

Mục đích của dotừ khóa trong forcú pháp vòng lặp Bash là gì? Đối với tôi, nó cảm thấy dư thừa.

for i in `seq 1 2`; do echo "hi"; done

Tại sao không phải là cú pháp như thế này?

for i in `seq 1 2`; echo "hi"; done

Tôi chắc chắn rằng nó một mục đích. Tôi chỉ muốn học.

Câu trả lời:


118

Lưu ý rằng cú pháp đó được kế thừa từ shell Bourne.

Sau tên biến, bạn có thể có indanh sách các phần tử được cung cấp rõ ràng hoặc dolặp lại các tham số vị trí.

for i in 1 2 3
do
  echo "$i"
done

Hoặc là

set 1 2 3
for i do
  echo "$i"
done

dotrong cả hai trường hợp (ngay cả khi nó không thực sự cần thiết trong trường hợp đầu tiên) sẽ tạo ra một cú pháp phù hợp hơn. Nó cũng phù hợp với while/ untilvòng lặp khi docần thiết.

while
  cmd1
  cmd2
do
  cmd3
  cmd4
done

Bạn cần phải docho biết danh sách các lệnh điều kiện kết thúc ở đâu.

Lưu ý rằng vỏ Bourne không hỗ trợ for i; do. Cú pháp đó cũng không phải là POSIX cho đến phiên bản 2016 của tiêu chuẩn ( for i doluôn luôn là POSIX; xem lỗi nhóm Austin liên quan ).

zsh có một vài hình thức tốc ký như:

for i in 1 2 3; echo $i
for i (1 2 3) echo $i
for ((i=1;i<=3;i++)) echo $i

Hoặc hỗ trợ cho nhiều hơn một biến:

for i j (1 a 2 b) echo $i $j

(mặc dù bạn không thể sử dụng inhoặc dolàm tên biến thay cho jở trên).

Ngay cả khi hiếm khi được ghi lại, hầu hết các shell giống Bourne (Bourne, ksh, bash, zsh, không phải ashcũng không yash) cũng hỗ trợ:

for i in 1 2 3; { echo "$i";}

Vỏ Bourne kshzsh(nhưng không bash) cũng hỗ trợ:

for i { echo "$i"; }

Trong khi bash, kshzsh(nhưng không phải vỏ Bourne):

for i; { echo "$i"; }

Tất cả (Bourne, bash, ksh, zsh) hỗ trợ:

for i
{ echo "$i";}

ksh93, bash, zshHỗ trợ:

for ((i=1;i<=3;i++)) { echo "$i"; }

2
Như mọi khi, câu trả lời đầy đủ và hoàn hảo (có tham chiếu đến zsh) ...
Kiwy

2
Nó không "thực sự cần thiết" trong cả hai trường hợp cho for; lệnh có thể được chấm dứt bởi một dòng mới hoặc dấu chấm phẩy. Nó có ý nghĩa hơn một chút đối với if/ while(trước đây thenthay vì do), nhưng về nguyên tắc, những thứ đó có thể đã bỏ qua nó và yêu cầu một hàm con hoặc dấu ngoặc để sử dụng (hiếm) nhiều lệnh. Tôi nghi ngờ lý do thực sự mà vỏ Bourne làm điều đó là do ALGOL làm điều đó và chúng ta nên vui mừng vì nó donekhông được đánh vần od.
Random832

4
@ Random832: Đó là vì odđã được sử dụng làm tên của chương trình Octal Dump.
dùng1024

8
quá nhiều thứ ở đây tôi không biết. Cảm ơn bạn!
Các cuộc đua nhẹ nhàng trong quỹ đạo

1
@mirabilos, for i dolà Bourne và POSIX, nhưng sẽ không hoạt động trong một số phiên bản cũ của vỏ II-tro. for i in "$@"sẽ không hoạt động trong vỏ Bourne nếu $IFSkhông chứa ký tự khoảng trắng. for i<newline>dothực sự là di động nhất nếu bạn cần xem xét các hệ thống BSD rất cũ. Xem in-ulm.de/~mascheck/various/bourne_args để biết chi tiết
Stéphane Chazelas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.