V tomto stručném průvodci se naučíme, jak opakovat příkaz, dokud v Linuxu neuspěje. To může být užitečné v mnoha případech. Tuto metodu můžete použít například k ověření síťového připojení mezi dvěma nebo více hostiteli nebo ke kontrole připojení k Internetu, abyste zjistili, zda jste stále online nebo offline. Ať už je důvod jakýkoli, pokud jste někdy chtěli opakovat příkaz nebo program Linuxu, dokud úspěšně neskončí, tento průvodce vám pomůže.
Opakujte příkaz, dokud v Linuxu neuspěje
Pro opakované provádění seznamu příkazů používáme následující konstrukty cyklování BASH :
- Během smyčky
- Až do smyčky.
Během smyčky spustí blok kódu (uzavřený v do ... hotovo ), když je podmínka pravda a pokračuje v provádění, dokud se podmínka nestane false . Jakmile se podmínka stane nepravdivou , smyčka while je ukončena.
Do smyčky je pravým opakem smyčky While. Spustí blok kódu (uzavřený v do ... hotovo ), když je podmínka false a pokračujte v provádění, dokud se podmínka nestane skutečnou . Jakmile se podmínka stane skutečnou , smyčka dokud je ukončena.
Nejprve se podívejme, jak opakovat linuxový příkaz nebo program, dokud neuspěje pomocí smyčky While.
1. Opakujte příkaz, dokud neuspěje pomocí smyčky While
Podívejte se na následující příkaz:
$ while ! ping -c 3 ostechnix.com ; do sleep 2 ; done ; xcalc
Tento příkaz se bude nadále pokoušet pingnout na stránky ostechnix.com. Jakmile bude web online, smyčka While se ukončí a zobrazí se "xcalc" program. Zde je xcalc volitelný. Je to jen pro účely oznámení. V opačném případě budeme možná muset neustále kontrolovat okno Terminálu, abychom ověřili, zda byl příkaz úspěšný či nikoli.
Vysvětlení:
Pojďme rozebrat výše uvedený příkaz a uvidíme, co každý příkaz dělá.
while ! ping -c 3 ostechnix.com ;
Toto je podmíněný příkaz. Jak vidíte v tomto prohlášení, před příkazem ping jsme uvedli ! charakter. Slouží jako "NE" stav. Takže skutečný význam výše uvedeného řádku je - i když NEMÁM pingnout na ostechnix.com .
do sleep 2 ; done ;
Výrok "do spánku 2" , znamená, že nebuďte do systému opakovaným zkoušením příkazu ping každou sekundu. Dáváme systému pokyn, aby chvíli počkal, například 2 sekundy, a poté zkusil pingnout na ostechnix.com. Jinými slovy, příkaz While bude pingovat stránky každé 2 sekundy. Jakmile se podmínka stane nepravdivou, cyklus while se ukončí.
xcalc ;
Spusťte program xcalc. Tento program se spustí pouze po úspěšném provedení předchozího příkazu.
Takže podle výše uvedeného příkazu, pokud je podmínka pravdivá (tj. pokud je ostechnix.com "NE" dosažitelný), spustí blok kódu uzavřený v do...hotovo . Zde je kód „sleep 2“. Počká tedy 2 sekundy a poté se pokusí znovu pingnout stránku. Bude to pokračovat, dokud se podmínka nestane nepravdivou. Jakmile se podmínka stane nepravdivou (tj. pokud je ostechnix.com dosažitelná), smyčka se ukončí a nakonec se otevře program xcalc.
Zde je ukázkový výstup výše uvedeného příkazu:
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. Opakujte příkaz, dokud neuspěje pomocí smyčky Until
Můžete to také provést pomocí smyčky „Dokud“, jak je uvedeno níže.
$ until ping -c 3 ostechnix.com ; do sleep 2 ; done ; xcalc
Pojďme si tento příkaz rozebrat a podívat se, co jednotlivé příkazy dělají:
until ping -c 3 ostechnix.com ;
Toto je podmíněný příkaz. To znamená - ping, dokud nebude stránka dostupná.
do sleep 2 ; done ;
Zkuste pingnout na stránku každé 2 sekundy, dokud nebude dostupná. Jakmile se podmínka stane pravdivou, tj. web bude dosažitelný, smyčka bude ukončena.
xcalc
Spusťte program xcalc. Spustí se pouze po úspěšném provedení předchozích příkazů.
Takže podle výše uvedeného příkazu bude smyčka Until ping ping na ostechnix.com, dokud neuspěje. Jakmile bude stránka dosažitelná, smyčka do skončí a otevře se program xcalc.
Související čtení:
- Jak spouštět příkaz Linux každých X sekund navždy
3. Opakujte předchozí příkaz, dokud nebude úspěšný
Nyní víme, jak na příkaz Linux, dokud se úspěšně neukončí. A co předchozí příkaz? Jak zopakujete nebo zopakujete předchozí příkazy, dokud neuspějí? To je také snadné!
Již jsme zveřejnili různé způsoby, jak zopakovat poslední příkaz. Pokud nevíte, jak na to, podívejte se do následujícího průvodce.
- Různé způsoby opakování posledního příkazu v systému Linux
Jak je uvedeno ve výše uvedeném odkazu, pro provedení posledního provedeného příkazu stačí napsat dvojitý vykřičník a stiskněte ENTER, jak je uvedeno níže:
$ !!
Tím se provede poslední příkaz.
Pokud tedy chcete opakovat předchozí příkazy, dokud neuspějí pomocí cyklu While, spusťte:
$ !!; while [ $? -ne 0 ]; do !!; done
Chcete-li opakovat předchozí příkazy, dokud neuspějí pomocí smyčky Until, spusťte:
$ until !!; do :; done
Další příklady smyček Bash While a Until naleznete v následujícím průvodci:
- Bash Scripting – smyčka Zatímco a dokud vysvětlená s příklady