logo

Bash Scripting – For Loop

Vzhledem k tomu, že BASH je jazyk příkazového řádku, získáme poměrně bohaté zkušenosti s programováním k provádění úkolů v terminálu. Můžeme použít smyčky a podmíněné příkazy ve skriptech BASH k provádění některých opakujících se a záludných problémů jednoduchým programovým způsobem. V tomto článku se zaměříme na pro smyčku ve skriptech BASH.

V závislosti na případu použití a problému, který se snaží automatizovat, existuje několik způsobů, jak používat smyčky.

  • Jednoduchá smyčka For
  • Smyčka for založená na rozsahu
  • Iterace pole pro smyčky
  • C-styl pro smyčky
  • Nekonečná smyčka for

Jednoduchá smyčka For

Pro provedení cyklu for můžeme napsat následující syntaxi:



#!/bin/bash  for n in a b c; do  echo $n done>
  • V první iteraci,n>převezme hodnotu a a skript vypíše a.
  • Ve druhé iteraci,n>převezme hodnotu b a skript vypíše b.
  • Ve třetí iteraci,n>převezme hodnotu c a skript vypíše c.

501

Výše uvedený příkaz bude iterovat přes zadané prvky po v klíčové slovo jeden po druhém. Prvky mohou být čísla, řetězce nebo jiné formy dat.

Smyčka for založená na rozsahu

Můžeme použít rozsahově založené pro smyčky. V tomto typu smyčky můžeme zadat číslo, které se má spustit, zastavit a zvýšit při každé iteraci (volitelné) v příkazu. Existují dva způsoby, jak to udělat, tj. uvedením hodnoty přírůstku/snižování a ve výchozím nastavení zvýšením o jednu. Syntaxe vypadá takto:

#!/bin/bash  for n in {1..5};  do  echo $n done>

500

Ve výše uvedeném kódu používáme {} k určení rozsahu čísel. Uvnitř složených závorek určíme počáteční bod následovaný dvěma tečkami a koncovým bodem. Ve výchozím nastavení se zvýší o jednu. Vytiskneme tedy 5 čísel od 1 do 5 včetně.

#!/bin/bash  for n in {1..5..2};  do  echo $n done>

502

Zde můžeme vidět, že smyčka se zvýšila o 2 jednotky, jak je uvedeno ve složených závorkách. Díky tomu je práce s čísly velmi snadná a pohodlná. To lze také použít s abecedními znaky.

POZNÁMKA: Nemůžeme použít proměnné uvnitř složených závorek, takže budeme muset hodnoty zakódovat napevno. Chcete-li použít proměnné, v několika následujících částech uvidíme tradiční smyčky for ve stylu C.

Iterace pole pro smyčky

Přes pole můžeme pohodlně iterovat v bash pomocí for smyček se specifickou syntaxí. Pro přístup ke všem prvkům v poli můžeme použít speciální proměnné v BASH, tj. @. Podívejme se na kód:

#!/bin/bash  s=('football' 'cricket' 'hockey')  for n in ${s[@]};  do  echo $n done>

503

Můžeme iterovat prvky pole pomocí operátoru @, který získá všechny prvky v poli. Pomocí cyklu for je tedy iterujeme jeden po druhém. Použijeme proměnnou ${název_proměnné[@]}, ve které složené závorky zde rozšiřují hodnotu proměnné s, která je polem řetězců. Pomocí operátoru [@] přistupujeme ke všem prvkům a tím je iterujeme v cyklu for. Tady, n je tedy iterátor, můžeme hodnotu vytisknout nebo na ní provést požadované zpracování.

C-styl pro smyčky

Jak bylo řečeno dříve, potřebujeme použít proměnné uvnitř cyklů for k iteraci přes řadu prvků. A tak smyčky for ve stylu C hrají velmi důležitou roli. Podívejme se, jak je používáme.

#!/bin/bash  n=7 for (( i=1 ; i<=$n ; i++ ));  do  echo $i done>

504

Jak vidíme, můžeme dynamicky používat hodnotu rozsahu koncových podmínek. Pamatujte, že mezery mezi dvojitými složenými závorkami mohou být záměrné a jsou součástí syntaxe. Cykly for ve stylu C jsou smyčky, které mají 3 části, inicializační iterátor, inkrementátor/dekrement a koncovou podmínku.

Ve výše uvedené syntaxi jsme inicializovali iterátor/počítač smyčky na 1, což může být cokoliv podle výběru. Druhá část je koncová podmínka, zde jsme použili proměnnou n který je inicializován před smyčkou for, a proto používáme jednoduchý $ operátor k získání hodnoty proměnné. Nakonec máme inkrementor/dekrement, který změní iterátor/počítač na hodnotu, která může být jakákoli, ale v příkladu jsme použili unární operátor (++) zvýšit hodnotu o jednu, která je ekvivalentní i=i+1 . Můžeme tedy použít výroky jako i+=2, i–,++i, a tak dále a tak dále.

Nekonečná smyčka for

Nepoužíváme to často, ale někdy je užitečné, aby některé věci fungovaly. Syntaxe je poměrně snadná a podobná cyklům for ve stylu C.

#!/bin/bash  n=4 for (( ; ; ));  do  if [ $n -eq 9 ];then  break  fi  echo $n  ((n=n+1)) done>

Smyčka začíná sn>nastavte na 4. Zvyšuje sen>o 1 při každé iteraci a vypíše hodnotun>až don>se rovná 9. Kdyn>dosáhne 9,break>se provede příkaz a smyčka se ukončí. Po vytištění čísel 4 až 8 se skript zastaví.

505

Jak vidíme, cyklus „for“ nemá žádné podmínky a toto se opakuje navždy, ale máme příkaz podmínky, který kontroluje, zda to netrvá navždy. Příkaz break používáme uvnitř příkazu if, abychom se dostali ze smyčky a zastavili iteraci s iterátorem. Použili jsme inkrementor ke zvýšení proměnné ve smyčce, jinak je smyčka nekonečná. Samozřejmě potřebujeme nějakou logiku, abychom se dostali ze smyčky, a proto musíme použít podmíněný příkaz if.