Jak powtarzać polecenie, aż zakończy się pomyślnie w systemie Linux
W tym krótkim przewodniku dowiemy się, jak powtarzać polecenie, aż zakończy się pomyślnie w systemie Linux. Może to być pomocne w wielu sytuacjach. Możesz na przykład użyć tej metody do sprawdzenia łączności sieciowej między dwoma lub większą liczbą hostów lub sprawdzenia połączenia z Internetem, aby sprawdzić, czy nadal jesteś w trybie online, czy offline. Niezależnie od przyczyny, jeśli kiedykolwiek chciałeś powtórzyć polecenie lub program w systemie Linux, aż zakończy się pomyślnie, ten przewodnik pomoże.
Powtarzaj polecenie, aż zakończy się pomyślnie w systemie Linux
Do powtarzalnego wykonywania listy poleceń używamy następujących konstrukcji pętli BASH:
- Podczas pętli,
- Aż do pętli.
While Loop wykonuje blok kodu (zawarty w do ... gotowe), gdy warunek jest prawda i wykonuje to dalej, aż warunek stanie się fałsz. Gdy warunek stanie się fałsz, pętla while zostanie zakończona.
Until Loop jest przeciwieństwem pętli While. Wykonuje blok kodu (zawarty w do ... gotowe), gdy warunek jest fałsz i wykonuje go, aż warunek stanie się falseprawda. Gdy warunek stanie się prawdą, pętla dopóki zostanie zakończona.
Najpierw przyjrzyjmy się, jak powtarzać polecenie lub program systemu Linux, aż do skutku, korzystając z pętli While.
1. Powtarzaj polecenia, używając pętli while
Spójrz na następujące polecenie:
while ! ping -c 3 ostechnix.com ; do sleep 2 ; done ; xcalcTo polecenie będzie kontynuować próbę wysłania polecenia ping do witryny ostechnix.com. Gdy witryna przejdzie w tryb online, pętla While zakończy się i wyświetli program „xcalc”. Tutaj xcalc jest opcjonalne. Służy wyłącznie do celów powiadamiania. W przeciwnym razie może być konieczne sprawdzanie okna terminala, aby sprawdzić, czy polecenie się powiodło, czy nie.
Wyjaśnienie:
Rozłóżmy powyższe polecenie i zobaczmy, co robi każda instrukcja.
while ! ping -c 3 ostechnix.com ;To jest zdanie warunkowe. Jak widać w tym stwierdzeniu, polecenie ping poprzedziliśmy znakiem !. Służy jako warunek „NIE”. Zatem rzeczywiste znaczenie powyższego wiersza jest takie: kiedy NIE można pingować ostechnix.com.
do sleep 2 ; done ;Stwierdzenie „uśpij 2” wskazuje, że nie należy obciążać systemu wielokrotnym wykonywaniem polecenia ping co sekundę. Instruujemy system, aby poczekał chwilę, na przykład 2 sekundy, a następnie spróbował pingować ostechnix.com. Innymi słowy, polecenie Podczas będzie pingować witrynę co 2 sekundy. Gdy warunek stanie się fałszywy, pętla while zakończy się.
xcalc ;Uruchom program xcalc. Ten program zostanie uruchomiony dopiero po pomyślnym wykonaniu poprzedniego polecenia.
Zatem zgodnie z powyższym poleceniem, jeśli warunek jest prawdziwy (tzn. jeśli witryna ostechnix.com jest „NIE” osiągalna), wykona blok kodu zawarty w do...done. Tutaj kod to „uśpienie 2”. Czeka więc 2 sekundy, a następnie próbuje ponownie pingować witrynę. Będzie to wykonywał, dopóki warunek nie stanie się fałszywy. Gdy warunek stanie się fałszywy (tzn. jeśli witryna ostechnix.com będzie osiągalna), pętla zakończy się i na koniec otworzy się program xcalc.
Oto przykładowe wyjście powyższego polecenia:
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 FontStruct2. Powtarzaj polecenia, używając pętli Until
Możesz to również zrobić za pomocą pętli „Until”, jak poniżej.
until ping -c 3 ostechnix.com ; do sleep 2 ; done ; xcalcRozłóżmy to polecenie i zobaczmy, co robi każda instrukcja:
until ping -c 3 ostechnix.com ;To jest zdanie warunkowe. Oznacza to - pinguj, aż witryna będzie osiągalna.
do sleep 2 ; done ;Spróbuj pingować witrynę co 2 sekundy, aż będzie ona osiągalna. Gdy warunek stanie się prawdziwy, tj. witryna będzie osiągalna, pętla zostanie zakończona.
xcalcUruchom program xcalc. Uruchomi się dopiero po pomyślnym wykonaniu poprzednich poleceń.
Zatem zgodnie z powyższym poleceniem pętla Until będzie wysyłać polecenie ping do witryny ostechnix.com, dopóki nie zakończy się pomyślnie. Gdy witryna będzie osiągalna, pętla do zakończy się i otworzy się program xcalc.
Powiązana lektura:
- Jak uruchamiać polecenie systemu Linux co X sekund na zawsze
3. Powtórz poprzednie polecenia
Wiemy teraz, jak wydawać polecenia w systemie Linux, dopóki nie zostaną pomyślnie zakończone. A co z poprzednim poleceniem? Jak powtarzać lub ponawiać poprzednie polecenia, aż do skutku? To też jest łatwe!
Pisaliśmy już o różnych sposobach powtórzenia ostatniego polecenia. Jeżeli nie wiesz jak to zrobić, zapoznaj się z poniższym poradnikiem.
- Różne sposoby powtarzania ostatniego polecenia w systemie Linux
Jak podano w powyższym linku, aby wykonać ostatnio wykonane polecenie, po prostu wpisz podwójne wykrzykniki i naciśnij ENTER jak poniżej:
!!Spowoduje to wykonanie ostatniego polecenia.
Jeśli więc chcesz powtarzać poprzednie polecenia, aż do skutku przy użyciu pętli While, uruchom:
!!; while [ $? -ne 0 ]; do !!; doneAby powtarzać poprzednie polecenia aż do skutku, używając pętli Until, uruchom:
$ until !!; do :; doneWięcej przykładów pętli Bash While i Until znajdziesz w poniższym przewodniku:
- Skrypty w języku Bash — pętle While i Until wyjaśnione na przykładach