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.txtsoubor je přesměrován dowhilesmyčka areadpří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í obouawkasedpro vyčištění prázdných řádků před jejich opakováním pomocíwhilesmyč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,ChelseaV 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ž
NUMje roven třem, smyčka bude ukončena pomocíbreakpří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
untilsmyčka je přesným opakemwhilesmyčka.whilesmyčka vyhodnotí podmínku jako pravdivou a provede blok kódu auntilloop vyhodnotí podmínku jako nepravdivou, aby byla smyčka provedena.Syntaxe je stejná jako u
whilesmyčka, ale místo klíčového slovawhile,untilbude použito.dokud [[ condition ]]proveďte Příkaz 1 Příkaz 2 .... Příkaz 3 hotovoZ níže uvedeného příkladu můžete vidět
untilsmyčka vyhodnotí proměnnouNUMbýt větší než pět. OdNUMje nepravda je nastaven na nulu a bude se zvyšovat v následujících iteracích pomocí((++NUM)). Takže kdyžNUMje rovno pět, podmínka je vyhodnocena jako pravdivá auntilsmyč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)) hotovoK řízení toku smyčky můžete použít
breakacontinueklíčová slova, jak je uvedeno vwhilesmyčka výše.Závěr
V tomto článku jsme viděli, jak používat
whilesmyčka auntilsmyčka v bash skriptech.Untilsmyčka se ve srovnání sforpoužívá nejméně často awhilesmyč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