2013-05-10 28 views
71

Cách tốt nhất để mô phỏng một vòng lặp do-while trong Bash là gì?Giả lập một vòng lặp do-while trong Bash

Tôi có thể kiểm tra điều kiện trước khi vào vòng while và sau đó tiếp tục kiểm tra lại điều kiện trong vòng lặp, nhưng đó là mã trùng lặp. Có cách nào sạch hơn không?

Pseudo code kịch bản của tôi:

while [ current_time <= $cutoff ]; do 
    check_if_file_present 
    #do other stuff 
done 

này không thực hiện check_if_file_present nếu đưa ra sau thời điểm $cutoff, và một do-while sẽ.

+0

Bạn đang tìm kiếm công tắc 'cho đến khi'? –

+2

@MichaelGardner 'until' cũng sẽ đánh giá điều kiện trước khi thực hiện phần thân của vòng lặp – Alex

+1

Ah, tôi hiểu rồi, tôi hiểu lầm về sự quấy rối của bạn. –

Trả lời

125

Hai giải pháp đơn giản:

  1. Execute mã của bạn một lần trước khi vòng lặp while

    actions() { 
        check_if_file_present 
        # Do other stuff 
    } 
    
    actions #1st execution 
    while [ current_time <= $cutoff ]; do 
        actions # Loop execution 
    done 
    
  2. Hoặc:

    while : ; do 
        actions 
        [[ current_time <= $cutoff ]] || break 
    done 
    
+1

':' được xây dựng trong, tương đương với được xây dựng trong 'true'. Cả hai đều "không làm gì thành công". – loxaxs

87

Đặt cơ thể của vòng lặp của bạn sau while và trước khi thử nghiệm. Phần thân thực tế của vòng lặp while phải là số không.

while 
    check_if_file_present 
    #do other stuff 
    ((current_time <= cutoff)) 
do 
    : 
done 

Thay vì ruột kết, bạn có thể sử dụng continue nếu bạn thấy rằng dễ đọc hơn

Tôi đã thay đổi thử nghiệm để sử dụng dấu ngoặc kép kể từ khi bạn xuất hiện để được so sánh số nguyên. Bên trong dấu ngoặc vuông đôi, các toán tử so sánh như <= là từ vựng và sẽ cho kết quả sai khi so sánh 2 và 10, ví dụ. Các toán tử đó không hoạt động bên trong các dấu ngoặc vuông đơn.

+10

Đây là một mẹo vặt ngon đang đi thẳng vào túi đặc biệt của tôi. –

+0

Tuyệt vời hack để làm trong khi trong bash !! Làm việc trưởng. –

+0

Có tương đương với một dòng 'trong khi {check_if_file_present; ((current_time <= cutoff)); }; làm:; done'? I E. là các lệnh bên trong điều kiện 'while' được phân tách một cách hiệu quả bằng dấu chấm phẩy không phải bằng cách, ví dụ: '&&', và được nhóm lại bởi '{}'? – Ruslan

3

Thay vì ruột kết, bạn có thể sử dụng tiếp tục nếu bạn thấy rằng dễ đọc hơn

uy tín của tôi là quá thấp để lại comment về bài đăng Dennis Williamson. Phương pháp này bắt chước cách thực hiện các vòng lặp Do-While mà tôi đang tìm kiếm - để kiểm tra điều kiện sau các hành động. Tôi cũng thấy rằng tôi có thể đặt tăng chỉ số (nếu cần) sau câu lệnh do, thay vì câu lệnh tiếp tục.

while 
    check_if_file_present 
    #do other stuff 
    ((current_time <= cutoff)) 
do 
    ((index++)); 
done 
+1

Vâng, bạn có đủ đại diện ngay bây giờ, phải không? Bạn nên xóa nhận xét khỏi câu trả lời của mình trước khi nhận xét bị xóa do nhầm lẫn. – jpaugh