Smyčka `for` je základním stavebním kamenem každého programovacího jazyka. Umožňuje programům opakovaně procházet definovanou sadou prvků.
Například, když potřebujete projít seznamem nebo polem obsahujícím ‚n‘ položek, použijete právě smyčku `for`. Podívejme se na jednoduchý příklad:
1Fialová2Indigová3Modrá4ZelenáDuhová Tabulka
K provedení jakýchkoli akcí nebo iteraci přes položky v uvedené tabulce je nutné použít smyčku `for`.
Smyčka For v Bash
V Bash skriptu má smyčka `for` následující syntaxi:
#!/bin/bash for VAR in 1 2 3 4 5.....N do AKCE 1 AKCE 2 ..... done
Použití smyčky `for` v Bash je poměrně přímočaré. První řádek, `#!/bin/bash`, označuje, že se jedná o Bash skript. `VAR` je dočasná proměnná, která slouží k iteraci. `N` reprezentuje maximální počet opakování smyčky. Klíčová slova `do` a `done` vymezují začátek a konec smyčky. Akce jsou příkazy, které se provádějí v rámci každé iterace smyčky.
Smyčku `for` v Bash můžeme použít s různými typy proměnných, jako jsou seznamy, řetězce, celá čísla a pole. V tomto článku si ukážeme několik běžných příkladů použití smyčky `for` v Bash.
Tyto programy můžete spouštět přímo v příkazovém řádku Bash, nebo je uložit do souboru a spustit soubor pomocí příkazu `bash nazev_souboru.sh`.
Zpracování statického seznamu
Představme si následující seznam: `duhovySeznamBarev = fialová, indigová, modrá, zelená, žlutá, oranžová, červená`
Výše uvedený seznam řetězců můžeme vypsat pomocí smyčky `for` v Bash následujícím způsobem:
#! /bin/sh # Definice seznamu duhovySeznamBarev=Fialova,Indigova,Modra,Zelena,Zluta,Oranzova,Cervena # Vzor oddělovače čárkami s použitím //,/ for barvy in ${duhovySeznamBarev//,/ } do echo $barvy done
Výstupem bude seznam položek na každém novém řádku.
#Výstup Fialova Indigova Modra Zelena Zluta Oranzova Cervena
Zpracování pole
Syntaxe pro definování pole se liší. Pro každý prvek (řetězec) použijte závorky.
duhovyPole=("Fialova" "Indigova" "Modra" "Zelena" "Zluta" "Oranzova" "Cervena") for barvy in "${duhovyPole[@]}"; do echo "Líbí se mi $barvy" done
Znak `@` se používá pro iteraci přes všechny prvky v poli.
#Výstup Líbí se mi Fialova Líbí se mi Indigova Líbí se mi Modra Líbí se mi Zelena Líbí se mi Zluta Líbí se mi Oranzova Líbí se mi Cervena
Smyčku `for` můžeme také využít k vypsání indexů a prvků pole.
#Výpis s indexem duhovyPole=("Fialova" "Indigova" "Modra" "Zelena" "Zluta" "Oranzova" "Cervena") for i in "${!duhovyPole[@]}"; do echo "Barva na indexu " $i " : " "${duhovyPole[$i]}" i=$((i+1)); done
#Výstup Barva na indexu 0 : Fialova Barva na indexu 1 : Indigova Barva na indexu 2 : Modra Barva na indexu 3 : Zelena Barva na indexu 4 : Zluta Barva na indexu 5 : Oranzova Barva na indexu 6 : Cervena
Všimněte si, že ve smyčce používáme `!`, abychom získali index prvku.
Iterace přes rozsah čísel
Smyčku `for` v Bash můžeme použít k iteraci přes určitý rozsah čísel.
#Iterace přes rozsah čísel echo "Odpočítávání začíná..." for N in {10..0} do echo "$N" done
Zápis `..` definuje rozsah čísel.
#Výstup 10 9 8 7 6 5 4 3 2 1 0
Můžeme také nastavit krok při výpisu čísel definováním rozsahu.
V následujícím příkladu přeskočíme počítání po 3.
#Iterace s přeskakováním čísel echo "Odpočítávání začíná..." for N in {30..0..3} do echo "$N" done
Výše uvedený program začíná číslem 30 a počítá dolů k 0. Poslední parametr ve smyčce `for`, tedy `3`, udává krok pro přeskakování čísel.
#Výstup 30 27 24 21 18 15 12 9 6 3 0
Řetězce a znaky
Smyčkou `for` v Bash můžeme provádět různé zajímavé operace s řetězci.
Například můžeme číst jednotlivé znaky řetězce pomocí operátoru `seq` ve smyčce `for`:
#Čtení znaků z řetězce muj_vyraz="vitejte" for i in $(seq 1 ${#muj_vyraz}) do echo "${muj_vyraz:i-1:1}" done
Všimněte si, že `seq` by mělo začínat 1, abychom získali první znak jako první.
#Výstup v i t e j t e
Řetězce oddělené mezerou můžeme také vypsat jeden po druhém:
#Čtení jednotlivých slov z věty moje_veta="Vítejte na etechblog.cz. Jedno místo pro všechny fandy technologií" for slovo in $moje_veta; do echo $slovo done
#Výstup Vítejte na etechblog.cz. Jedno místo pro všechny fandy technologií
Výrazy
Podobně jako v jiných programovacích jazycích, jako je Java, můžeme do smyčky `for` v Bash vkládat i výrazy.
for (( var=10; var>=0; var-- )) do echo "Odpočítávání...$var" done
#Výstup Odpočítávání...10 Odpočítávání...9 Odpočítávání...8 Odpočítávání...7 Odpočítávání...6 Odpočítávání...5 Odpočítávání...4 Odpočítávání...3 Odpočítávání...2 Odpočítávání...1 Odpočítávání...0
Zpracování argumentů z příkazové řádky
Pro čtení argumentů z příkazové řádky používáme příkaz `read`. V následujícím příkladu získáme od uživatele několik čísel a vypíšeme jejich součet pomocí smyčky `for` v Bash. Proměnnou `total` používáme pro uložení mezisoučtu a konečného součtu všech čísel.
read -a array -p "Zadejte čísla, která chcete sečíst:" total=0 for i in ${array[@]}; do let total+=$i done echo "Součet čísel je: $total"
Výstup je:
#Výstup Zadejte čísla, která chcete sečíst: 3 4 66 Součet čísel je: 73
Hledání lichých a sudých čísel
Pro nalezení lichých a sudých čísel mezi 1 a 10 (nebo libovolným číslem N) bychom měli použít podmínku `if` spolu se smyčkou `for` v Bash. Pro určení sudého čísla vydělíme číslo 2 a pokud je zbytek 0, zařadíme ho jako sudé, jinak jako liché.
#Deklarace seznamů, kam budou sudá a lichá čísla uložena suda_cisla="" licha_cisla="" for (( i=1; i<=10; i++ )) do zbytek=$(( $i % 2 )) if [ $zbytek -eq 0 ]; then suda_cisla="$suda_cisla $i " else licha_cisla="$licha_cisla $i " fi done echo "Sudá čísla jsou: "$suda_cisla echo "Lichá čísla jsou: "$licha_cisla
Všimněte si, že v uvedeném příkladu je rozsah nastaven na 10. Toto číslo můžeme změnit, abychom získali sudá a lichá čísla v libovolném rozsahu. Můžete se také pokusit přečíst číslo od uživatele pomocí příkazu `read`, jak jsme se naučili v předchozí části.
#Výstup Sudá čísla jsou: 2 4 6 8 10 Lichá čísla jsou: 1 3 5 7 9
Nekonečná smyčka
Nekonečná smyčka je smyčka, která se nepřestane provádět, dokud program není násilně ukončen stiskem Ctrl+C. Nekonečnou smyčku můžeme snadno vytvořit pomocí operátoru `; ;` uvnitř smyčky `for`:
for (( ; ; )) do echo "Vítejte na etechblog.cz" done
#Výstup Vítejte na etechblog.cz Vítejte na etechblog.cz Vítejte na etechblog.cz Vítejte na etechblog.cz Vítejte na etechblog.cz Vítejte na etechblog.cz Vítejte na etechblog.cz Vítejte na etechblog.cz Vítejte na etechblog.cz Vítejte na etechblog.cz ^C $
Příkaz `break`
Příkazy `break` se používají k přerušení smyčky, když je splněna podmínka v `if`.
for barva in Fialova Indigova Modra Zelena Zluta Oranzova Cervena do if [[ "$barva" == 'Zelena' ]]; then break fi echo "Hledám Zelenou, aktuální barva je $barva" done echo "Našel jsem svou barvu $barva"
V tomto příkladu se snažíme najít zelenou barvu. Smyčka `for` prochází každou barvu a jakmile je nalezena zelená barva, program opustí smyčku díky příkazu `break`.
#Výstup Hledám Zelenou, aktuální barva je Fialova Hledám Zelenou, aktuální barva je Indigova Hledám Zelenou, aktuální barva je Modra Našel jsem svou barvu Zelena
Příkaz `continue`
Příkaz `continue` se používá k přeskočení aktuální iterace a přechodu na další na základě určité podmínky. Například, pokud nechceme vypsat barvu ‚Zelenou‘ z předchozího programu, můžeme použít `continue` a zobrazí se všechny ostatní barvy kromě Zelené.
for barva in Fialova Indigova Modra Zelena Zluta Oranzova Cervena do if [[ "$barva" == 'Zelena' ]]; then continue fi echo "$barva" done
#Výstup Fialova Indigova Modra Zluta Oranzova Cervena
Závěrem
Probrali jsme nejběžnější použití smyčky `for` v Bash s řetězci, celými čísly, poli a seznamy. Pokud se učíte Linux, ale máte počítač s Windows 10, můžete využít funkci WSL a nainstalovat si Linux na svůj počítač s Windows.
Poté můžete používat terminál Linux podobným způsobem jako CMD.
Dále se můžete podívat na článek Jak spouštět bash skripty pomocí Pythonu?