2013-05-10 12 views
71

Qual è il modo migliore per emulare un ciclo do-while in Bash?Emulazione di un ciclo do-while in Bash

È possibile verificare la condizione prima di accedere al ciclo while, quindi continuare a ricontrollare la condizione nel ciclo, ma si tratta di codice duplicato. C'è un modo più pulito?

pseudo codice del mio script:

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

Ciò non eseguire check_if_file_present se lanciato dopo il tempo $cutoff, e do-while avrebbe fatto.

+0

Stai cercando l'opzione 'until'? –

+2

@MichaelGardner 'until' valuterà anche la condizione prima di eseguire il corpo del ciclo – Alex

+1

Ah, capisco, ho frainteso la tua diligenza. –

risposta

125

Due soluzioni semplici:

  1. eseguire il codice di una volta prima che il ciclo while

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

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

':' è un built-in, equivalente al 'true' incorporato. Entrambi "non fanno nulla con successo". – loxaxs

87

Posizionare il corpo del ciclo dopo il while e prima del test. Il corpo reale del ciclo while dovrebbe essere un no-op.

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

Al posto dei due punti, è possibile utilizzare continue se si scopre che più leggibile

ho cambiato il test da usare doppie parentesi dal momento in cui sembra essere il confronto interi. All'interno di doppie parentesi quadre, operatori di confronto come <= sono lessicali e danno il risultato sbagliato quando confrontano 2 e 10, ad esempio. Questi operatori non lavorano all'interno di parentesi quadre singole.

+10

Questo è un delizioso trucco che sta andando dritto nella mia borsa speciale. –

+0

Grande hack per fare mentre in bash !! Prefetto lavori –

+0

È equivalente a 'riga singola' while {check_if_file_present; ((CURRENT_TIME <= taglio)); }; fare :; done'? Cioè sono i comandi all'interno della condizione 'while' effettivamente separati da punti e virgola non ad es. '&&', e raggruppato da '{}'? – Ruslan

3

Al posto dei due punti, è possibile utilizzare continuare se si scopre che più leggibile

La mia reputazione è troppo basso per lasciare un commento sul post di Dennis Williamson. Questo metodo simula il modo di fare i loop Do-While che stavo cercando - per testare le condizioni dopo le azioni. Ho anche scoperto che posso inserire un incremento dell'indice (se necessario) dopo l'istruzione do, invece di un'istruzione continue.

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

Beh, hai abbastanza rappresentanti ora, giusto? Dovresti rimuovere il commento dalla tua risposta, prima che venga cancellato per errore. – jpaugh