2013-05-10 28 views
71

Jaki jest najlepszy sposób emulacji pętli do-while w Bash?Emulacja pętli do-while w Bash

Mogłem sprawdzić stan przed wprowadzeniem do pętli while, a następnie kontynuować sprawdzanie stanu w pętli, ale jest to zduplikowany kod. Czy istnieje czystszy sposób?

Pseudo kod mojego skryptu:

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

ta nie wykonuje check_if_file_present jeśli uruchomiona po raz $cutoff i do-while będzie.

+0

Szukasz przełącznika 'until'? –

+2

@MichaelGardner 'until' również oceni stan przed wykonaniem ciała pętli – Alex

+1

Ach, rozumiem, źle zrozumiałem twój quandry. –

Odpowiedz

125

Dwa proste rozwiązania:

  1. Wykonanie kodu kiedyś pętli while

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

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

':' jest wbudowane, równoważne z wbudowanym 'true'. Obaj "nie robią nic pomyślnie". – loxaxs

87

Place ciało swojej pętli po while i przed testem. Rzeczywista bryła pętli while powinna być wolna od op.

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

Zamiast okrężnicy, można użyć continue jeśli okaże się, że bardziej czytelny

Zmieniłem test ponieważ wydaje się być porównanie liczby całkowite na używanie podwójnych nawiasów. Wewnątrz podwójnych nawiasów kwadratowych operatory porównania, takie jak <=, są leksykalne i dadzą zły wynik, na przykład porównując 2 i 10. Operatory te nie działają w nawiasach kwadratowych.

+10

To jest pyszna sztuczka, która idzie prosto do mojej specjalnej torby. –

+0

Świetny hack do robienia w bash !! Działa prefekt. –

+0

Czy jest to odpowiednik jednolinijkowego 'while {check_if_file_present; ((current_time <= cutoff)); }; robić :; zrobione "? To znaczy. są poleceniami wewnątrz warunku 'while', skutecznie oddzielonymi średnikami, nie przez np. '&&' i pogrupowane według '{}'? – Ruslan

3

Zamiast okrężnicy, można korzystać nadal, jeśli okaże się, że bardziej czytelny

Moja reputacja jest zbyt niska komentarz na stanowisku Dennis Williamsona opuścić. Ta metoda naśladuje sposób wykonywania pętli Do-While, których szukałem - test warunków po akcjach. Odkryłem również, że mogę wstawić przyrost indeksu (jeśli jest to konieczne) po instrukcji do, zamiast instrukcji continue.

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

Cóż, masz już wystarczającą liczbę przedstawicieli, prawda? Powinieneś usunąć komentarz z odpowiedzi, zanim zostanie on usunięty przez pomyłkę. – jpaugh