In questa breve guida, impareremo come ripetere un comando fino a quando non avrà successo in Linux. Questo può essere utile in molte occasioni. Ad esempio, puoi utilizzare questo metodo per verificare la connettività di rete tra due o più host o controllare la connettività Internet per vedere se sei ancora online o offline. Quindi, qualunque sia il motivo, se hai mai voluto ripetere un comando o un programma Linux fino a quando non si conclude con successo, questa guida ti aiuterà.
Ripeti il comando finché non riesce in Linux
Per l'esecuzione ripetitiva di un elenco di comandi, utilizziamo i seguenti costrutti di loop BASH :
- Durante il ciclo,
- Fino al ciclo.
Durante il ciclo esegue il blocco di codice (racchiuso all'interno di do ... done ) quando la condizione è vera e continua a eseguirlo finché la condizione non diventa falsa . Quando la condizione diventa falsa , il ciclo while è terminato.
Fino al ciclo è esattamente l'opposto del ciclo While. Esegue il blocco di codice (racchiuso all'interno di do ... done ) quando la condizione è falsa e continua a eseguirlo finché la condizione non diventa vera . Quando la condizione diventa vera , il ciclo fino al termine.
Per prima cosa, vediamo come ripetere un comando o un programma Linux finché non riesce utilizzando il ciclo While.
1. Ripeti un comando finché non riesce usando il ciclo While
Dai un'occhiata al seguente comando:
$ while ! ping -c 3 ostechnix.com ; do sleep 2 ; done ; xcalc
Questo comando continuerà a provare a eseguire il ping del sito ostechnix.com. Una volta che il sito è online, il ciclo While terminerà e visualizzerà "xcalc" programma. Qui, xcalc è facoltativo. È solo a scopo di notifica. In caso contrario, potrebbe essere necessario continuare a controllare la finestra del Terminale per verificare se il comando è riuscito o meno.
Spiegazione:
Analizziamo il comando precedente e vediamo cosa fa ogni istruzione.
while ! ping -c 3 ostechnix.com ;
Questa è l'istruzione condizionale. Come puoi vedere in questa dichiarazione, abbiamo preceduto il comando ping con ! carattere. Serve come "NON" condizione. Quindi il vero significato della riga sopra è - mentre NON è in grado di eseguire il ping di ostechnix.com .
do sleep 2 ; done ;
L'affermazione "dormire 2" , indica che non martellano il sistema provando ripetutamente il comando ping ogni secondo. Indichiamo al sistema di attendere un po', ad esempio 2 secondi, quindi proviamo a eseguire il ping di ostechnix.com. In altre parole, il comando While continuerà a eseguire il ping del sito ogni 2 secondi. Una volta che la condizione diventa falsa, il ciclo while terminerà.
xcalc ;
Esegui il programma xcalc. Questo programma verrà eseguito solo dopo la corretta esecuzione del comando precedente.
Quindi, come per il comando precedente, se la condizione è vera (cioè se ostechnix.com è "NON" raggiungibile), eseguirà il blocco di codice racchiuso in do...done . Qui, il codice è "sleep 2". Quindi attende 2 secondi e poi riprova a eseguire il ping del sito. Continuerà a eseguirlo finché la condizione non diventa falsa. Una volta che la condizione diventa falsa (cioè se ostechnix.com è raggiungibile), il ciclo terminerà e infine si aprirà il programma xcalc.
Ecco l'output di esempio del comando precedente:
ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known ping: ostechnix.com: Name or service not known PING ostechnix.com (104.26.5.40) 56(84) bytes of data. 64 bytes from 104.26.5.40 (104.26.5.40): icmp_seq=1 ttl=55 time=63.6 ms 64 bytes from 104.26.5.40 (104.26.5.40): icmp_seq=2 ttl=55 time=84.8 ms 64 bytes from 104.26.5.40 (104.26.5.40): icmp_seq=3 ttl=55 time=79.9 ms --- ostechnix.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2001ms rtt min/avg/max/mdev = 63.602/76.114/84.810/9.068 ms Warning: Cannot convert string "-adobe-symbol-*-*-*-*-*-120-*-*-*-*-*-*" to type FontStruct
2. Ripetere un comando finché non riesce utilizzando il ciclo Fino
Puoi anche farlo usando il ciclo "Fino a" come di seguito.
$ until ping -c 3 ostechnix.com ; do sleep 2 ; done ; xcalc
Analizziamo questo comando e vediamo cosa fa ogni istruzione:
until ping -c 3 ostechnix.com ;
Questa è l'istruzione condizionale. Significa - ping finché il sito non è raggiungibile.
do sleep 2 ; done ;
Prova a eseguire il ping del sito ogni 2 secondi finché non è raggiungibile. Una volta che la condizione diventa vera, ovvero il sito è raggiungibile, il ciclo verrà terminato.
xcalc
Esegui il programma xcalc. Verrà eseguito solo dopo l'esecuzione corretta dei comandi precedenti.
Quindi, come per il comando precedente, il ciclo Until continuerà a eseguire il ping di ostechnix.com fino a quando non avrà esito positivo. Una volta che il sito sarà raggiungibile, il ciclo fino a terminerà e si aprirà il programma xcalc.
Lettura correlata:
- Come eseguire un comando Linux ogni X secondi per sempre
3. Ripetere il comando precedente finché non riesce
Ora sappiamo come eseguire un comando Linux fino a quando non esce correttamente. E il comando precedente? Come ripeti o riprova i comandi precedenti finché non hanno esito positivo? Anche questo è facile!
Abbiamo già pubblicato diversi modi per ripetere l'ultimo comando. Se non sai come farlo, consulta la seguente guida.
- Diversi modi per ripetere l'ultimo comando in Linux
Come indicato nel link sopra, per eseguire l'ultimo comando eseguito, è sufficiente digitare doppi punti esclamativi e premi INVIO come di seguito:
$ !!
Questo eseguirà l'ultimo comando.
Quindi, se vuoi ripetere i comandi precedenti finché non hanno esito positivo utilizzando il ciclo While, esegui:
$ !!; while [ $? -ne 0 ]; do !!; done
Per ripetere i comandi precedenti finché non hanno esito positivo utilizzando il ciclo Fino, esegui:
$ until !!; do :; done
Per ulteriori esempi su Bash While loop e Until loop, fai riferimento alla seguente guida:
- Scripting Bash - Spiegazione del ciclo While e Until con esempi