10 Bash pro příklady smyčky s vysvětlením

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?