GNU/Linux >> Znalost Linux >  >> Linux

Skriptování Bash – smyčka dokud a dokud vysvětlená s příklady

Toto je článek na pokračování ve smyčce bash, kde jsme v předchozím článku vysvětlili cyklus for . V tomto článku se podíváme na další dvě bashové smyčky, a to while a until smyčka.

while smyčka se většinou používá, když musíte číst obsah souboru a dále jej zpracovávat. Čtení a zápis do souboru jsou běžné operace při psaní bash skriptů. Uvidíme, jak číst soubory pomocí while smyčka.

Již máme velmi podrobný článek o tom, jak zapisovat do souboru pomocí operátorů přesměrování.

  • Přesměrování Bash vysvětleno na příkladech

Funkce while smyčka je podobná jako for smyčka. for smyčka iteruje přes seznam položek a několikrát spustí blok kódu N. Zde v while smyčka, podmínka je vyhodnocena jako první, a pokud je podmínka pravdivá, bude blok kódu prováděn, dokud nebude podmínka vyhodnocena jako nepravda.

1. Zatímco smyčka

Níže je while syntaxe smyčky. Smyčka začíná "při" klíčové slovo následované podmínkou, která by měla být vyhodnocena jako pravdivá. Mezi until a done blok je místo, kde budou umístěny vaše kódy, které budou N kolikrát iterovány.

zatímco [[ podmínka ]]provádí Příkaz 1 Příkaz 2 .... Příkaz 3hotovo

PŘÍKLAD 1 – Vyhodnoťte a opakujte

Podívejte se na níže uvedený příklad. Zde jsem vytvořil proměnnou "NUM=5" a můj stav ($NUM -ne 0 ), cyklus se spustí, pokud je proměnná NUM se nerovná nule.

$ NUM=5zatímco [[ $NUM -ne 0 ]]proveďte printf "Hodnota NUM =$NUM \n" ((--NUM))hotovo

Měli byste používat počítadla ke zvýšení nebo snížení hodnot uložených v proměnných při práci s while smyčky. Pokud ne, stane se nekonečnou smyčkou a NUM bude vždy nastaveno na pět. Zde snižuji hodnotu NUM v každé iteraci spuštěním ((--NUM)) , takže když moje proměnná NUM je nastaven na nulu, smyčka skončí.

((++NUM)) → Zvýšit proměnnou NUM o 1, podobně jako při spuštění NUM=$(( $NUM + 1))((--NUM)) → Snížit proměnnou NUM o 1, podobně jako při spuštění NUM=$(( $NUM - 1 ))

PŘÍKLAD 2 – Nekonečné smyčky

Nekonečná smyčka je místo, kde je vaše podmínka vždy vyhodnocena jako pravdivá a smyčka se nikdy neukončí.

Chcete-li vytvořit nekonečné smyčky, můžete použít bash-builtin true klíčové slovo. Použijte také "sleep" při testování nekonečných smyček, což vám dá kontrolu při zastavení skriptu, jinak bude vaše obrazovka zaplavena výstupy s rychlým rolováním.

$ NUM=0zatímco truedo printf "Hodnota NUM =$NUM \n" ((++NUM)) spánek 2hotovo

PŘÍKLAD 3 – Interní oddělovač polí (IFS)

IFS je speciální proměnná shellu, která rozhoduje o tom, jak se zachází s hranicemi vašich slov. Standardně je IFS nastaveno na mezeru, tabulátor a znak nového řádku. Otevřete terminál a spusťte následující příkazy:

$ var1="foo:bar foo bar"
$ pro val v $var1do echo $valdone 

Podívejte se na výstup. for smyčka iteruje přes řetězec a je to IFS, kdo rozhoduje o hranicích slova a považuje mezeru za oddělovač polí.

Nyní znovu spusťte níže uvedený kód. Zde je IFS nastaveno na dvojtečku .

$ var1="foo:bar foo bar"
$ IFS=":"
$ pro val v $var1do echo $valdone

Z výše uvedeného výstupu můžete vidět, že vlastní oddělovací dvojtečka pole se používá jako hranice slova. IFS můžete nastavit zpět do výchozího stavu spuštěním unset příkaz.

$ unset IFS

PŘÍKLAD 4 – Čtení souboru pomocí smyčky while

while smyčka se doporučuje, když chcete číst soubor řádek po řádku a zpracovat jej.

Vytvořte nový soubor s názvem test.txt pomocí následujícího obsahu. Za řádkem 2 je prázdný řádek, který ukazuje, jak se zachází s prázdnými řádky.

14:00 Brighton vs Leicester14:00 West Ham vs Man Utd16:30 Spurs vs Chelsea

Použijeme read příkaz, který přijímá vstup z přesměrování a ukládá jej do proměnné spolu s operátorem přesměrování vstupu, kde bude název souboru přesměrován na while smyčka. read příkaz použije výchozí IFS k nastavení hranice rozdělení slova.

$ při čtení linedo echo $linedone   

Ve výše uvedeném příkladu test.txt soubor je přesměrován do while smyčka a read příkaz čte řádek po řádku a ukládá jej do proměnné "řádek" a dále se zpracovává v rámci smyčky. Prázdné řádky se při dodržení této metody nevynechávají a toto není chování, které byste mohli chtít. Takže musíte explicitně vytvořit prázdné řádky, které chcete přeskočit.

Existuje několik možností, jak oříznout prázdné řádky ze vstupního souboru. Můžete použít sed , awk , a podmíněné příkazy atd. Dávám přednost použití obou awk a sed pro vyčištění prázdných řádků před jejich opakováním pomocí while smyčka.

# POUŽITÍM SED$ sed -i '/^[[:space:]]*$/d' test.txt14:00 Brighton vs Leicester14:00 West Ham vs Man Utd16:30 Spurs vs Chelsea
# POUŽITÍM AWK$ awk 'NF' test.txt

Jak je vidět v předchozích příkladech, IFS můžete upravit podle toho, jak chcete soubor číst. Pokud například zpracováváte soubor CSV, lze oddělovač nastavit na čárku. Upravil jsem stejný vstupní soubor, aby byl ve formátu CSV.

14:00,Brighton,Leicester14:00,West Ham,Man Utd16:30,Spurs,Chelsea

V níže uvedeném příkladu je IFS nastaveno na čárku (IFS="," ) a každé pole bude uloženo v samostatné proměnné (čas, tým1, tým2).

při IFS="," přečtěte si čas tým1 tým2 do echo "$team1 hraje proti $team2 v $time"hotovo   

PŘÍKLAD 5 – Řízení toku smyčky pomocí funkce Přerušit a pokračovat

Pokud jste četli náš článek bash for loop, možná víte, co je break a pokračovat používá. Přestávka i pokračování jsou klíčová slova vestavěná do bash, která vám pomohou řídit tok vaší smyčky.

Klíčové slovo "break" zcela opustí smyčku a předá řízení dalšímu příkazu ve skriptu. V níže uvedeném příkladu. Když NUM je roven třem, smyčka bude ukončena pomocí break příkaz.

$ NUM=5zatímco [[ $NUM -ne 0 ]]proveďte printf "Hodnota NUM =$NUM \n" if [[ $NUM -eq 3 ]] pak break fi ((--NUM))hotovo  

Klíčové slovo „continue“ přeskočí aktuální iteraci a vrátí řízení zpět do cyklu while a spustí další iteraci.

$ NUM=0zatímco [[ $NUM -lt 5 ]]proveďte ((++NUM)) if [[ $NUM -eq 3 ]] pak pokračujte fi printf "Hodnota NUM =$NUM \n" hotovo  

2. Až do smyčky

until smyčka je přesným opakem while smyčka. while smyčka vyhodnotí podmínku jako pravdivou a provede blok kódu a until loop vyhodnotí podmínku jako nepravdivou, aby byla smyčka provedena.

Syntaxe je stejná jako u while smyčka, ale místo klíčového slova while , until bude použito.

dokud [[ condition ]]proveďte Příkaz 1 Příkaz 2 .... Příkaz 3 hotovo

Z níže uvedeného příkladu můžete vidět until smyčka vyhodnotí proměnnou NUM být větší než pět. Od NUM je nepravda je nastaven na nulu a bude se zvyšovat v následujících iteracích pomocí ((++NUM)) . Takže když NUM je rovno pět, podmínka je vyhodnocena jako pravdivá a until smyčka se přestane provádět.

$ NUM=0
$ do [[ $NUM -ge 5 ]]ozvu $NUM ((++NUM))hotovo

Chcete-li vytvořit nekonečné smyčky, můžete použít klíčové slovo "false" .

$ NUM=0
$ dokud falsedo echo $NUM ((++NUM)) hotovo

K řízení toku smyčky můžete použít break a continue klíčová slova, jak je uvedeno v while smyčka výše.

Závěr

V tomto článku jsme viděli, jak používat while smyčka a until smyčka v bash skriptech. Until smyčka se ve srovnání s for používá nejméně často a while smyčky, ale záleží na rozhodnutí o vašem skriptu a o tom, jaké typy smyček jsou vyžadovány. Používejte všechny tři smyčky pohodlně.

Máte-li jakékoli dotazy nebo zpětnou vazbu, neváhejte nás kontaktovat prostřednictvím sekce komentářů níže.

Související čtení:

  • Bash Scripting – funkce vysvětlené na příkladech
  • Bash Scripting – proměnné vysvětlené na příkladech
  • Příkaz Bash Echo vysvětlený s příklady v Linuxu
  • Výukový program Bash Heredoc pro začátečníky
  • Jak opakovat příkaz, dokud v Linuxu neuspěje
  • Rozdíl mezi definováním proměnných Bash s exportem a bez exportu

Linux
  1. Bash pro průvodce smyčkou a příklady

  2. Příkazy hlavy a ocasu v Linuxu vysvětleny s příklady

  3. Udržujeme vás ve smyčce – příklady opakování pro, Zatímco, dokud

  1. Bash, zatímco Loop

  2. Příklady Bash for Loop a While Loop

  3. Pomocí a ve smyčce Bash while

  1. Bash dokud smyčka

  2. Bash For Loop s praktickými příklady

  3. Příkaz Bash Echo vysvětlený s příklady v Linuxu