22Kapitola

Bash 22: Aritmetická rozšíření

Ve dvacátém díle jsme si představili oblast rozšiřování neboli expanzí. Jeden z typů expanzí (rozšíření parametrů a proměnných) jsme probírali minule. Dnes si ukážeme aritmetická rozšíření a celé téma expanzí uzavřeme.

Aritmetické expanze

Jak jsme si již řekli, expanze v Bashi znamená nahrazení nějakého zástupného řetězce jeho logickým významem (hodnotou) - např. hodnota proměnné, výsledek provedení nějakého příkazu nebo regulárního výrazu, doplnění cesty k souboru apod. V případě aritmetických expanzí jde o náhradu matematického výrazu jeho výsledkem. Výraz přitom zapisujeme do dvojitých závorek následovně: $((vyraz)) - např. tak můžeme zadat echo $(( 3 * 3 )). Možná vám až dech vyrazí, jaké Bash umí výrazy. Vedle klasických +, -, *, / jsou to:

 

Další aritmetickou konstrukcí, kterou Bash zvládá, je kondiční operátor. Jeho zápis má podobu vyraz1?vyraz2:vyraz3. Funguje tak, že pokud platí podmínka ve vyraz1 (výsledkem je nenulová hodnota), je proveden vyraz2, jinak se provede vyraz3. Např. echo $((a==6?a:a++)) vypíše hodnotu a pokud se rovná 6, jinak také vypíše hodnotu a a poté ji zvýší o jedničku.

Ještě zmíním skupinu konstrukcí označovaných za přiřazovací. V podstatě jde o většinu zde zmíněných operandů doplněných znakem rovnítko. Např. prostý zápis a=5 přiřadí proměnné a hodnotu 5, zatímco a+=3 vypíše hodnotu a poté, co k ní připočte číslo 3. K dispozici jsou vedle aritmetických (*= /= %= += -=) také konstrukce logické (<<= >>= &= ^= |=).

Speciální znaky

V posledních třech dílech jsme se věnovali operacím, které provádí Bash se vstupem z příkazové řádky. Ukázali jsme si jednoduché i složitější konstrukce. Nepohovořili jsme však o třech znacích se zvláštním významem: obrácené lomítko (\), apostrof (') a uvozovky ("). Bash tyto znaky zadané na příkazové řádce (tedy ne takové, které vznikly v důsledku expanzí) odstraní.

Uvozovky slučují do jednoho bloku (pozičního parametru) skupinu znaků obsahující např. mezery, a přitom zaručují provedení expanzí (náhrada jmen proměnných za jejich hodnoty apod.) Apostrofy také slučují skupinu znaků dohromady, ale zabrání provedení případných expanzí, takže řetězec bude použit přesně tak, jak byl zadán. Obrácené lomítko potlačuje speciální význam bezprostředně následujícího zadaného znaku, kterým může být #, $, &, *, ale i závorka, mezera nebo další obrácené lomítko.

To je asi tak všechno, co Bash dělá se vstupem na příkazové řádce před samotným provedením zadaného příkazu. Protože tento seriál není překladem manuálové stránky ani referenční příručkou, neobsahuje úplně všechny mechanismy. Bádavý uživatel tak může najít mechanismy typu Process Substitution nebo bitová a logická negace. Příště si ukážeme, jak si v Bashi, resp. shellovém skriptu, nadefinovat vlastní funkce.