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