


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 | |
|---|---|
| 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
