PředchozíNahoruDalšíObsah

6. Aritmetika v BASH

BASH také podobně jako většina programovacích jazyků dovede provádět matematické výrazy. Jak jste již viděli, aritmetika se provádí pomocí příkazu expr. Nicméně stejně jako příkaz true je i příkaz expr pomalý, a proto lze aritmetika dělat pomocí interních příkazů bash. Stejně jako je dvojtečka alternativa k příkazu true, je i k příkazu expr alternativa. A tou je uzavření výrazu do kulatých závorek. Výsledek tedy dostaneme pomocí konstrukce $((...)). Rozdíl oproti výrazu $(...) je v počtu závorek.

Zkuste tedy následující příklad:

#!/bin/bash
x=8
y=4
z=$(($x + $y))
echo "Součet $x a $y je $z"

Bash je schopen vykonat i následující matematické operace:

Možné matematické operace
Operace
Znak
Sčítání +
Odčítání -
Násobení *
Dělení /
Dělení modulo %

Dělení modulo je zbytek po dělení. Tedy například 5 % 2 = 1, protože 5 děleno 2 je 2, zbytek 1. Je také nutno podotknout, že bash dovede pracovat pouze s čísly celými. Nelze tedy používat desetinná čísla.

Zde je příklad skriptu s aritmetickými operacemi:

#!/bin/bash
x=5
y=3

add=$(($x + $y))
sub=$(($x - $y))
mul=$(($x * $y))
div=$(($x / $y))
mod=$(($x % $y))

echo "Součet: $add"
echo "Rozdíl: $sub"
echo "Součin: $mul"
echo "Podíl: $div"
echo "Zbytek: $mod"

Místo add=$(($x + $y)) je též možné použít add=$(expr $x + $y) nebo add=`expr $x + $y`.

Manuálová stránka příkazu expr je uvedena zde.

EXPR(1)                                                   EXPR(1)

JMÉNO
       expr - vyhodnotí výraz

POUŽITÍ
       expr výraz...
       expr {--help,--version}

POPIS
       Tato  dokumentace  není dále udržována a může být nepřesná
       nebo neúplná.  Autoritativním zdrojem je Texinfo  dokumen­
       tace.

       Tato  manuálová  stránka  popisuje GNU verzi příkazu expr.
       Příkaz expr vyhodnotí výraz a  vypíše  výsledek  na  stan­
       dardní  výstup.  Každé  slovo  (token)  ve výrazu musí být
       zadáno jako samostatný  parametr.   Operandy  ve  výrazech
       jsou  buď  čísla  nebo  řetězce. Psaní řetězců do uvozovek
       nebo apostrofů příkaz  expr  sám  nevyžaduje,  ale  jejich
       použití může být nezbytné, aby speciální znaky v řetězcích
       neinterpretoval shell.  Příkaz  expr  automaticky  převádí
       operandy  ve  výrazech  na  celá  čísla nebo řetězce podle
       toho, jaké na ně mají být aplikovány operace.

       Příkaz expr rozpoznává následující binární operátory  (zde
       seřazené od nejnižší po nejvyšší prioritu):

       |      Pokud  první  argument  není  ani  prázdný  řetězec
              (null) ani 0, je výsledkem první argument, jinak je
              výsledkem  druhý argument.  Obvykle se používá jako
              logické `nebo'.

       &      Jestliže  ani  jeden  argument  není  ani   prázdný
              řetězec  (null) ani 0, je výsledkem první argument,
              jinak je výsledkem 0.

       <  <=  =  ==  !=  >=  >
              Pokusí se převést oba argumenty na čísla a  provést
              číselné  porovnání;  jestliže  převod na čísla není
              možné  uskutečnit,  provede   abecední   porovnání.
              Vrátí  1,  jestliže  je podmínka porovnání splněna,
              jinak vrátí 0.  Operátor == je synonymem pro =.

       +  -   Aritmetické operace sčítání a odčítání.  Oba  argu­
              menty  jsou  napřed  převedeny na čísla; je chybou,
              jestliže není možné převod na čísla provést.

       *  /  %
              Aritmetické operace násobení, dělení  a  zbytek  po
              celočíselném dělení, jako v jazyku C. Oba argumenty
              jsou napřed převedeny na čísla; je chybou, jestliže
              není možné převod na čísla provést.

       :      Porovnání  řetězce  s  regulární výrazem. Oba argu­
              menty  jsou  převedeny  na  řetězce  a  na  začátek
              druhého  je  automaticky  přidán znak `^'. Potom je
              první argument porovnán s druhým, který  je  inter­
              pretován  jako regulární výraz. Pokud první řetězec
              vyhovuje  regulárnímu  výrazu,  pak  je   porovnání
              úspěšné.  V tomto případě, jestliže je část druhého
              operandu uzavřena mezi `\(' a `\)', bude  výsledkem
              ta  část  prvního  řetězce,  která vyhovovala části
              regulárního výrazu  mezi  `\('  a  `\)',  jinak  je
              výsledkem  číslo  udávající,  kolik  znaků  prvního
              řetězce vyhovovalo celému regulárnímu výrazu. Pokud
              porovnání úspěšné nebylo, pak jestliže v regulárním
              výrazu bylo  `\('  a  `\)',  je  výsledkem  prázdný
              řetězec,  jinak  je  výsledkem  0.  Může být použit
              nejvýše jeden pár `\(' a `\)'.


       Navíc jsou rozpoznávána následující klíčová slova:

       match řetězec regex
              Alternativní zápis porovnání s regulárním  výrazem.
              Totéž jako ``řetězec : regex''.

       substr řetězec pozice délka
              Vrátí  podřetězec  zadaného  řetězce  začínající na
              zadané pozici a nejvýše o  zadané  délce.  Jestliže
              pozice  a  délka nejsou kladná čísla, vrátí prázdný
              řetězec.

       index řetězec seznam-znaků
              Vrátí první pozici v řetězci, na které  je  některý
              ze  znaků  uvedených  v  seznamu-znaků.  Jestliže v
              řetězci není žádný znak ze seznamu-znaků, vrátí  0.

       length řetězec
              Vrátí délku řetězce.

       Pro  vyznačení  pořadí  vyčíslování je možné použít kulaté
       závorky.  Klíčová slova nemohou být použita jako  řetězce.

   VOLBY
       Když je GNU příkaz expr vyvolán právě s jedním parametrem,
       jsou rozpoznávány následující volby:

       --help Vypíše návod k použití na standardní výstup a  bez­
              chybně skončí.

       --version
              Vypíše číslo verze na standardní výstup a bezchybně
              skončí.

PŘÍKLADY
       Přičtení jedničky do proměnné shellu a:

              a=`expr $a + 1`

       Následující příklad může být použit pro  vypsání  poslední
       složky  jména  souboru uloženého v proměnné a (hodnota v a
       nemusí obsahovat `/'):

              expr $a : '.*/\(.*\)' \| $a

       -- metaznaky shellu je nutné dávat  do  uvozovek  či  apo­
       strofů.

       Příkaz expr nastavuje následující kódy ukončení (exit sta­
       tus):

       0 jestliže výsledek není ani prázdný řetězec ani 0,
       1 jestliže výsledek je prázdný řetězec nebo 0,
       2 pro chybné výrazy.

FSF                    GNU Shell Utilities                      1

PředchozíNahoruDalšíObsah

10. dubna 2001 19:14