Větvení (case) a cykly

Větvení (case)

Pokud se rozhodujeme mezi dvěma možnostmi, je konstrukce if optimální. Pokud se naopak potřebujeme rozhodovat mezi více možnostmi podle obsahu proměnné, můžeme použít konstrukci case:

  case $promenna in
     1 ) echo "Promenna je rovna 1" ;;
     2 ) echo "Promenna je rovna 2" ;;
     3 ) echo "Promenna je rovna 3" ;;
     * ) echo "Promenna neni rovna 1, 2 ani 3"
  esac

Můžeme použít i složitější výrazy se zástupnými znaky:

  case $promenna in
     [a-z] | [A-Z] ) echo "Jedno male nebo velke pismeno" ;;
     [0-9] ) echo "Jednociferne cislo" ;;
     * ) echo "Neco jineho"
  esac

Někdy potřebujeme určitou činnost opakovat. A to je úloha pro cykly. Ty můžeme rozdělit do dvou kategorií. Cykly provádějící určitý počet opakování (cyklus for) a cykly založené na podmínce (cykly while a until).

Cyklus for

Syntaxe cyklu for vypadá takto:

  for promenna in 1 2 3 4 5; do
     echo "$promenna"
  done

Cyklus pracuje tak, že každý z prvků za in vždy postupně dosadí do proměnné promenna, provede kód uvnitř svého těla a tento postup opakuje do té doby, dokud nevyčerpá všechny prvky. V tomto případě jsme za prvky dosadili čísla od 1 do 5. Výstup tohoto cyklu by vypadal takto:

  1
  2
  3
  4
  5

Pokud chceme použít určitou sekvenci čísel, nemusíme se namáhat s jejich vyplňováním. Postačí použít příkaz seq:

  for i in `seq 1 50`; do
     echo $i
  done

Tento úsek kódu vypíše čísla od 1 do 50. Cyklus for však umožňuje, aby cyklem procházely i zcela jiné hodnoty. Kupříkladu, následující skript vypíše obsah aktuálního adresáře:

  for i in *; do
     echo $i            
  done

Cykly while a until

Cykly while a until pracují tak, že opakují určitý postup, dokud je splněna určitá podmínka (cyklus while) nebo dokud určitá podmínka splněna není (cyklus until). Syntaxe je prakticky shodná:

  cislo=4
  until [ $cislo -eq 5 ]; do
    echo "$cislo"
    cislo=$((cislo+1))
  done
  while [ $cislo -gt 0 ]; do
    echo "$cislo"
    cislo=$((cislo-1))
  done

Tento program vypíše:

  4
  5
  4
  3
  2
  1

První cyklus se opakuje tak dlouho, dokud nenastane jeho podmínka, tj. dokud proměnná cislo nabyde hodnoty 5. Druhý cyklus se opakuje tak dlouho, dokud je jeho podmínka splněná, tj dokud je proměnná cislo větší než 0.

Pomocí cyklu while můžeme třeba zpracovávat po řádcích nějaký soubor:

  cat soubor | while read radka; do
    echo $radka
  done

break a continue

Někdy můžeme mít zájem běh nějakého cyklu ukončit úplně nebo nedokončit iteraci a provést další opakování. K tomu slouží příkazy break a continue:

  #!/bin/bash
  
  for i in 1 2 3 4 5 6; do
     if [ $i -eq 3 ]; then
        continue
     elif [ $i -eq 5 ]; then
        break
     fi
     echo $i
  done

Výstupem tohoto skriptu bude:

  1
  2
  4

Proč? Když se do proměnné i dostala trojka, použili jsme příkaz continue, který přeskočil zbytek těla konstrukce for a přistoupil k další hodnotě, tedy ke čtyřce. V momentě, kdy se do proměnné i dostala pětka, provedl se příkaz break, který ukončil provádění celého cyklu.

Kam dál

pokrocili/komandlajna/vetveni_cykly.txt · Poslední úprava: 2009/11/12 20:35 autor: Michal Dočekal
CC Attribution-Share Alike 3.0
www.chimeric.de Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 PDF Export