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 $linedoneVe výše uvedeném příkladu
test.txt
soubor je přesměrován dowhile
smyčka aread
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í obouawk
ased
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.txtJak 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"hotovoPŘÍ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))hotovoKlíč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" hotovo2. Až do smyčky
until
smyčka je přesným opakemwhile
smyčka.while
smyčka vyhodnotí podmínku jako pravdivou a provede blok kódu auntil
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 slovawhile
,until
bude 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
until
smyčka vyhodnotí proměnnouNUM
být větší než pět. OdNUM
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á auntil
smyčka se přestane provádět.$ NUM=0$ do [[ $NUM -ge 5 ]]ozvu $NUM ((++NUM))hotovoChcete-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
break
acontinue
klíčová slova, jak je uvedeno vwhile
smyčka výše.Závěr
V tomto článku jsme viděli, jak používat
while
smyčka auntil
smyčka v bash skriptech.Until
smyčka se ve srovnání sfor
používá nejméně často awhile
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