Không có gì trong khi: có nghĩa là gì?


27

Tôi biết whilevòng lặp là gì. Tuy nhiên, tôi chỉ thấy nó hoạt động với:

while [condition]
while ![condition]
while TRUE (infinite loop)

Trường hợp tuyên bố sau whilephải là TRUEhoặc FALSE.

Có một lệnh dựng sẵn shell được đặt tên :. Nó được mô tả như một lệnh giả không làm gì cả, nhưng tôi không biết liệu nó có giống ở đây không, ngay cả khi nó có thể TRUEhoặc FALSE. Có lẽ nó là một cái gì đó khác nhau, nhưng những gì?


4
Lệnh :không làm gì ngoài việc luôn thoát với mã trả về 0. Vì vậy, nó cũng giống như vậy while true(giả sử hệ thống của bạn có một truetệp thực thi).
John1024

@ John1024 Nó trả về 0 trừ khi việc đánh giá các đối số của nó gây ra lỗi bằng, ví dụ, gán giá trị cho biến chỉ đọc.
Kusalananda

3
@Kusalananda Vâng, nếu :lệnh không bao giờ được thực thi, nó sẽ không trả về 0. Tuy nhiên, theo tôi thì đó là quá tầm thường.
hvd

Câu trả lời:


50

Cú pháp là:

while
  first list of commands
do
  second list of commands
done

chạy danh sách lệnh thứ hai trong một vòng lặp miễn là danh sách lệnh đầu tiên (vì vậy lần chạy cuối cùng trong danh sách đó) là thành công.

Trong danh sách lệnh đầu tiên đó , bạn có thể sử dụng [lệnh để thực hiện các loại thử nghiệm khác nhau hoặc bạn có thể sử dụng :lệnh null không làm gì và trả về thành công hoặc bất kỳ lệnh nào khác.

while :; do cmd; done

Chạy đi chạy cmdlại mãi mãi như :luôn trả lại thành công. Đó là vòng lặp mãi mãi . Bạn có thể sử dụng truelệnh thay thế để làm cho nó dễ đọc hơn:

while true; do cmd; done

Mọi người thường thích :như :là luôn luôn được xây dựng trong thời gian truekhông (một thời gian dài trước đây, hầu hết vỏ đã trueđược xây dựng trong ngày nay) ¹.

Các biến thể khác bạn có thể thấy:

while [ 1 ];  do cmd; done

Ở trên, chúng tôi đang gọi [lệnh để kiểm tra xem chuỗi "1" có trống không (vì vậy luôn luôn đúng)

while ((1)); do cmd; done

Sử dụng ((...))cú pháp Korn / bash / zsh để bắt chước while(1) { ...; }C.

Hoặc những thứ phức tạp hơn như until false; do cmd; done, until ! true...

Đôi khi chúng được đặt bí danh như:

alias forever='while :; do'

Vì vậy, bạn có thể làm một cái gì đó như:

forever cmd; done

Ít người nhận ra rằng điều kiện này là một danh sách các lệnh. Chẳng hạn, bạn thấy mọi người viết:

while :; do
  cmd1
  cmd2 || break
  cmd3
done

Khi họ có thể đã viết:

while
  cmd1
  cmd2
do
  cmd3
done

Nó thực sự có ý nghĩa đối với nó là một danh sách vì bạn thường muốn làm những việc giống như while cmd1 && cmd2; do...; donedanh sách lệnh.

Trong mọi trường hợp, lưu ý rằng đó [là một lệnh giống như bất kỳ lệnh nào khác (mặc dù được tích hợp sẵn trong các shell giống như Bourne hiện đại), nó không phải được sử dụng chỉ trong danh sách if/ while/ untilđiều kiện và các danh sách điều kiện đó không có để sử dụng lệnh đó nhiều hơn bất kỳ lệnh nào khác.


¹ :cũng ngắn hơn và chấp nhận đối số (mà nó bỏ qua). Trong khi hành vi của truehoặc falsekhông được chỉ định nếu bạn vượt qua nó bất kỳ đối số. Vì vậy, người ta có thể làm ví dụ:

while : you wait; do
  something
done

Nhưng, hành vi của:

until false is true; do
  something
done

là không xác định (mặc dù nó sẽ hoạt động trong hầu hết các shell / falsehiện thực).


12

while :là một vòng lặp vô hạn. :chỉ không làm gì cả (thành công).

Vì vậy, nếu bạn muốn vỏ của mình bị treo mãi mãi mà không làm gì, bạn có thể viết nó dưới dạng

while :
do
    :
done

Hoặc trong một dòng duy nhất ;thay vì dòng mới:while :; do :; done

while :thường được sử dụng nếu bạn muốn làm một cái gì đó lặp đi lặp lại mà không có một điều kiện đặc biệt kèm theo. Bạn có thể sử dụng continue, các breakcâu lệnh trong vòng lặp để điều khiển nó hoặc để di chuyển điều kiện đến cuối vòng lặp giống như một do ... whilecấu trúc.


12

dù sao đi nữa, câu lệnh sau phải là TRUE hoặc FALSE.

Không, lệnh trong phần điều kiện có thể là bất kỳ lệnh nào (*) . Tất cả các lệnh shell có một số giá trị trả về và whilevòng lặp (cũng như ifđiều kiện) lấy giá trị trả về là 0 là "true" và tất cả các lệnh khác là "false". (* hoặc danh sách một số lệnh, lệnh cuối cùng được tính)

Về phần :, hướng dẫn của Bash cho biết rõ trạng thái trả về của nó là gì:

: [arguments]
Không làm gì ngoài việc mở rộng đối số và thực hiện chuyển hướng. Trạng thái trả về bằng không.

Nội dung helpthậm chí còn rõ ràng hơn:

 $ help :
 [...]
 No effect; the command does nothing
 Exit Status:
 Always succeeds.

s/any command/any sequence of commands/, như Stéphane nói rõ.
Toby Speight
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.