Ve skriptování shellu Bash jsou smyčky užitečné pro automatizaci opakujících se úloh. Když musíte ve skriptu opakovat úlohu N kolikrát, měly by být použity smyčky. Bash podporuje tři typy smyček.
- Pro smyčku
- Během smyčky
- Až do smyčky
Všechny tři cykly slouží ke stejnému účelu opakování úkolu N, kolikrát, když je podmínka splněna, ale s rozdíly v tom, jak jsou definovány a použity k dosažení výsledku.
Tento článek se zaměří na "cyklus for" ve skriptování Bash. O dalších dvou smyčkách se dozvíme v našem dalším průvodci.
Pro syntaxi smyčky
Než napíšete svůj první for loop
, je velmi důležité porozumět syntaxi .
for NAME in [ LIST OF ITEMS ] do Command 1 Command 2 ..... Command N done
Pojďme to rozebrat a uvidíme, co to udělá.
- Začněte klíčovým slovem
"for"
následovaný názvem proměnné. - Klíčové slovo
"in"
získat seznam položek a uložit jej do proměnné pro každou iteraci. - Klíčové slovo
"do"
a"done"
označuje začátek a konec bloku smyčky a příkaz by měl být zapsán v do a hotovo. - Neexistují žádná přísná pravidla pro odsazení, ale pro lepší čitelnost použijte 2 mezery nebo tab(4) . V celém skriptu buďte konzistentní při používání mezery nebo tabulátoru.
Můžete také vytvořit jeden řádek pro smyčky. Vytvořte for loop
v terminálu a stiskněte klávesu se šipkou nahoru a uvidíte, že bash jej automaticky převede na jednořádkovou smyčku.
for NAME in [ LIST OF ITEMS]; do COMMANDS ; done
Příklad 1 – Práce se seznamem položek
Začněme jednoduchým příkladem.
Z předchozí části jste možná pochopili, že for loop
přijímá seznam položek. Seznam položek může být cokoli jako řetězce, pole, celá čísla, rozsahy, výstup příkazu atd.
Otevřete terminál a spusťte následující část kódu.
N=1 for val in Welcome To Ostechnix do echo "Iteration $N → $val" ((++N)) done
Pojďme to rozebrat.
"Welcome to Ostechnix"
je seznam položek předávaných dofor loop
a každé slovo bude vybráno jako samostatná iterace a uloženo do proměnné (val
).- Proměnná může být pojmenována jakkoli. Zde jej pojmenuji jako
val
. - V seznamu jsou tři položky, takže v
for loop
budou tři iterace a pokaždé hodnotu proměnnéval
je vytištěna. - Příkaz ((
++N
)) bude fungovat jako čítač a zvýší hodnotu proměnnéN
takže jej lze vytisknout vecho
prohlášení.

Nyní po spuštění výše uvedeného for loop
stiskněte na terminálu šipku nahoru a uvidíte víceřádkový for loop
je převeden na jeden řádek pro smyčku.
Příklad 2 – Práce s rozsahy
Možná budete chtít spustit for loop
N kolikrát, k tomu můžete použít bash vestavěný generátor sekvence "{x..y[..incr]}"
která vygeneruje posloupnost čísel.
X
=Počáteční celočíselná hodnotaY
=Koncová celočíselná hodnotaIncr
=volitelná celočíselná hodnota, která inkrementuje celá čísla
Řekněme, že chcete spustit cyklus pětkrát, pak můžete použít následující úryvek.
for rng in {1..5} do echo "Value is == $rng" done

Můžete také použít volitelný parametr přírůstek, který bude provádět přírůstky po krocích.
Podívejte se na níže uvedený úryvek, kde je uveden přírůstek tři. Tím se vygeneruje sekvence od jedné a provede se krokový přírůstek o tři až do konečné hodnoty deset.
for rng1 in {1..10..3} do echo "Value is == $rng1" done

Příklad 3 – Spouštění příkazů
Můžete spustit libovolné příkazy, které odvozují seznam položek ke zpracování pomocí for loop
. Příkaz by měl být buď označen zaškrtnutím "``
" nebo hranaté závorky "$()
".
V níže uvedeném příkladu spouštím příkaz, který získá ID procesu a odfiltruje posledních pět procesů. Smyčka For bude nyní iterovat každé ID procesu.
for list in $(ps -ef | awk {' print $2 '} | tail -n 5) do echo $list done

Příklad 4 – Smyčka přes prvky pole
Ve scénářích v reálném čase uložíte některé hodnoty do polí a pokusíte se pole procházet smyčkou pro další zpracování.
Než pochopíte, jak iterovat polem, musíte porozumět chování dvou speciálních proměnných ( [email protected]
a $*
). Obě jsou to speciální proměnné, které se používají pro přístup ke všem prvkům z pole.
Spusťte v terminálu následující část kódu. Pole X je vytvořen a když se pokusím vytisknout všechny hodnoty ($X
) stejně jako tisk proměnných, pouze vrací první hodnotu z pole.
$ X=( 16 09 2021 "Thursday Third Week" )
$ echo $X
16

Pro přístup ke všem prvkům v poli musíte buď použít [email protected]
nebo $*
. Syntaxe pro přístup k hodnotám pole bude následující.
$ echo ${X[@]}
16 09 2021 Thursday Third Week
$ echo ${X[*]}
16 09 2021 Thursday Third Week

Nyní to použijte s for loop
iterovat hodnoty pole.
X=( 16 09 2021 "Thursday Third Week" ) for items in ${X[@]} do echo $items done

Podívejte se na výše uvedený výstup. Tento výstup se zdá být chybný, protože řetězec (čtvrtek třetí týden) uvnitř pole by měl být považován za jednu hodnotu. Zde je však každá položka považována za samostatnou položku.
Toto je výchozí chování, když používáte [email protected]
nebo $
. Abyste tomu zabránili, uzavřete proměnnou rozšíření pole ([email protected]
nebo $
) ve dvojitých uvozovkách.
for items in "${X[@]}" do echo $items done

Když používáte dvojité uvozovky, [email protected]
a $*
chovat se jinak. Zatímco [email protected]
rozšíří pole na každou položku v poli podobném, jak je znázorněno ve výše uvedeném příkladu $*
rozšíří celé pole jako jednu hodnotu.
for items in "${X[*]}" do echo $items done

Pozor: Oba [email protected]
a $*
chovat se stejně, pokud není uzavřeno do dvojitých uvozovek . Zkuste se vyhnout $*
pokud to není potřeba.
Příklad 5 – styl C pro syntaxi smyčky
Bash také nabízí c styl for loop
syntax. Pokud jsou z C jazykové pozadí, pak pro vás tato syntaxe nebude nová.
Místo toho, abyste procházeli seznamem, budete vyhodnocovat podmínku, a pokud je podmínka pravdivá, budou provedeny příkazy v rámci cyklu.
V této syntaxi jsou tři parametry, kterým musíte rozumět.
- Proměnná - Proměnná je inicializována pouze jednou při spuštění smyčky.
- Stav - Podmínka by měla být pravdivá, aby se smyčka provedla, jinak se smyčka nespustí.
- Počítadlo - Tím se zvýší hodnota proměnné.
Každý parametr by měl být oddělen středníkem (;
) a měl by být uzavřen ve dvojitých závorkách jak je uvedeno níže.
for (( variable; condition; counter )) do Command 1 Command 2 Command N done
Podívejte se na níže uvedený příklad přestupného roku.
- Proměnná
YEAR=2010
bude nejprve inicializováno. - Podmínka
YEAR<=20
bude vyhodnocen a pokud je pravdivý, kód mezido
adone
blok bude proveden. - Počítadlo
YEAR++
zvýší rok o jeden počet. Do proměnnéYEAR
je zvýšen na2020
, smyčka se bude opakovat. - V rámci
do
adone
bloku, je napsán podmíněný příkaz, aby se zjistilo, zda je rok přestupný nebo ne.
for ((YEAR=2010; YEAR<=2020; YEAR++)) do if [[ $(expr $YEAR % 4) -eq 0 ]] then echo "$YEAR = leap year" else echo "$YEAR = not a leap year" fi done

Příklad 6 – použití příkazu přerušení, pokračování
Existují dvě vestavěná klíčová slova bash, která se používají k řízení toku vašich smyček.
- Přestávka - Opustí smyčku a přeskočí všechny čekající iterace.
- Pokračovat – Přeskočte aktuální iteraci a předejte ovládací prvek zpět do cyklu for, aby se provedla další iterace.
Chcete-li zkontrolovat, zda jsou vestavěné bash nebo ne, použijte type
příkaz:
$ type break continue break is a shell builtin continue is a shell builtin
Podívejme se ve stručnosti, jak a kde lze použít jak přerušení, tak pokračování.
K nalezení přestupného roku používám stejný kód, který jsem použil v předchozí části. V tomto případě potřebuji pouze to, co bude prvním přestupným rokem mezi roky 2010 a 2020. Pokud se tento rok najde, moje smyčka může skončit.
for ((YEAR=2010; YEAR<=2020; YEAR++)) do if [[ $(expr $YEAR % 4) -eq 0 ]] then echo "$YEAR = leap year" break else echo "$YEAR = not a leap year" fi done

Z výše uvedeného výstupu můžete vidět for loop
iteruje, a když je nalezen první přestupný rok 2012, break
příkaz je přečten a smyčka je opuštěna a řízení je předáno zpět terminálu.
Nyní měním stejný kód pro "continue"
prohlášení. continue
příkaz, když je interpretován, přeskočí aktuální iteraci, tj. jakýkoli kód, který následuje po příkazu continue, a předá řízení zpět do for loop
spustit další iteraci.
for ((YEAR=2010; YEAR<=2020; YEAR++)) do if [[ $(expr $YEAR % 4) -eq 0 ]] then echo "$YEAR = leap year" else continue echo "$YEAR = not a leap year" fi done

Z obrázku výše můžete vidět, že existuje příkaz echo, který je příkazem continue přeskočen.
Příklad 7 – Skutečné použití příkazu
Když vytváříte smyčky nebo podmíněné příkazy, nemůžete nechat blok kódu prázdný. Bash vyvolá chybu syntaxe.


Podívejte se na oba výše uvedené obrázky. Na prvním obrázku jsem vytvořil for loop
ale žádné příkazy mezi do
a done
. Podobně na druhém obrázku jsem nechal klauzuli else prázdnou. V obou případech bash nepřijímá prázdné bloky a vyvolává chyby syntaxe.
Můžete použít vestavěný bash “true"
klíčové slovo, které bude vždy nastavovat výstupní kód na 0 (úspěch).
$ type true true is a shell builtin
Tímto způsobem necháváte blok kódu prázdný, aniž by bash způsoboval nějaké chyby.

Závěr
V tomto průvodci smyčkou Bash for jsme začali úvodem do smyček a syntaxí for loop
spolu se stylem C. Viděli jsme také, jak používat pro smyčky v různých podmínkách spolu s příkazy pro kontrolu smyčky break and continue. Podívejte se do našeho dalšího průvodce, kde se dozvíte o Bash While
a Until
smyčky s příklady.
- Bash Scripting – smyčka Zatímco a dokud není vysvětlena příklady
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
- Přesměrování Bash vysvětleno na příkladech
- Rozdíl mezi definováním proměnných Bash s exportem a bez exportu