fare ... mentre o fare ... fino a quando nello script shell POSIX


16

Esiste il noto while condition; do ...; doneloop, ma esiste un do... whileloop di stile che garantisce almeno un'esecuzione del blocco?


Mille grazie Shawn, non mi aspettavo che la risposta diventasse la risposta selezionata così in fretta. Quindi: grazie per la selezione.

Risposte:


15

Una versione molto versatile di a do ... whileha questa struttura:

while 
      Commands ...
do :; done

Un esempio è:

#i=16
while
      echo "this command is executed at least once $i"
      : ${start=$i}              # capture the starting value of i
      # some other commands      # needed for the loop
      (( ++i < 20 ))             # Place the loop ending test here.
do :; done
echo "Final value of $i///$start"
echo "The loop was executed $(( i - start )) times "

Così com'è (nessun valore impostato per i) il loop viene eseguito 20 volte.
Commentando la linea ON che imposta ia 16 i=16, il loop viene eseguito 4 volte.
Per i=16, i=17, i=18e i=19.

Se i è impostato su (diciamo 26) nello stesso punto (l'inizio), i comandi vengono comunque eseguiti la prima volta (fino a quando non viene testato il comando di interruzione loop).

Il test per un po 'dovrebbe essere veritiero (stato di uscita pari a 0).
Il test deve essere invertito per un ciclo until, ovvero: essere falsy (stato di uscita non 0).

Una versione POSIX necessita di diversi elementi modificati per funzionare:

i=16
while
       echo "this command is executed at least once $i"
       : ${start=$i}              # capture the starting value of i
       # some other commands      # needed for the loop
       i="$((i+1))"               # increment the variable of the loop.
       [ "$i" -lt 20 ]            # test the limit of the loop.
do :;  done
echo "Final value of $i///$start"
echo "The loop was executed $(( i - start )) times "

./script.sh
this command is executed at least once 16
this command is executed at least once 17
this command is executed at least once 18
this command is executed at least once 19
Final value of 20///16
The loop was executed 4 times 

Tenere presente che se si utilizza set -equalcosa che non funziona all'interno del blocco condizione while non interromperà l'esecuzione: ad es. set -e; while nonexistentcmd; true; do echo "SHiiiiit"; exit 3; done-> merda accade. Quindi, se usi questo, devi stare molto attento con la gestione degli errori, cioè concatenare tutti i comandi &&!
Timo

17

Non c'è un do ... while o do ... fino al loop, ma la stessa cosa può essere realizzata in questo modo:

while true; do
  ...
  condition || break
done

per fino a quando:

until false; do
  ...
  condition && break
done

Puoi usare una delle linee di interruzione con uno dei loop - mentre true o fino a quando false significa semplicemente "per sempre". Capisco che un po 'preserva la tranquillità o la finzione per avere la condizione felice-uscita o triste-uscita.
android.weasel il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.