Làm thế nào để viết một vòng lặp for chạy một lệnh không đồng bộ trong mỗi lần lặp?


23

Tôi tự hỏi tại sao có lỗi khi sử dụng lệnh không đồng bộ trong vòng lặp?

$ for i in {1..8}; do sleep 100 & ; done
bash: syntax error near unexpected token `;'

Nếu tôi viết nó là

$ for i in {1..8}; do 
> sleep 100 & 
> done

cái này hoạt động tốt

Làm thế nào tôi có thể viết nó trong một dòng mà không có lỗi?

Câu trả lời:


39

Thả ;:

for i in {1..8}; do sleep 100 & done

&phân tách các lệnh , do đó, ;là không liên quan (và shell mong đợi một cái gì đó giữa &;).


Cảm ơn. "Shell mong đợi một cái gì đó giữa & và;", vậy tại sao một lệnh trống không ổn giữa & & ;?
Tim

5
Lệnh no-op thực sự là:
HTNW

1
@StephenKitt, phần bạn tham chiếu cũng nêu rõ: "Trong phiên tương tác hoặc tập lệnh có các lệnh khác, các ký tự <newline> hoặc <dấu chấm phẩy> ... sẽ không đủ điều kiện là lệnh trống được mô tả ở đây vì chúng sẽ bị tiêu thụ bởi các phần của ngữ pháp. " Hmmm ...
Thẻ đại diện

1
@Wildcard thật thú vị, tôi đã không nghĩ đến hậu quả của câu đó khi nghiên cứu câu trả lời cho việc theo dõi của Tim. Kích hoạt chế độ POSIX của Bash không thay đổi hành vi của nó trong vấn đề này. Hmmm thực sự ...
Stephen Kitt

2
@Wildcard: echo foo ; ; echo bartrong bash 4.4 nói syntax error near unexpected token `;'. dashđưa ra một lỗi tương tự. Trong trường hợp này, nó là một lệnh trống vì không có phần nào khác của ngữ pháp sử dụng nó. Tôi nghĩ rằng họ có thể đang nói về sự dư thừa ;ở cuối dòng như sleep 100;(dòng mới).
Peter Cordes

22

Nhómdo hành động của bạn trong dấu ngoặc nhọn:

for i in {1..8}; do { sleep 100 & }; done

Dễ hiểu cho bạn cũng như cho Bash!

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.