Trojjediné bc
Mocný nástroj bc je tu s námi už velmi dlouho. Jedná se vlastně o matematický programovací jazyk, s jehož pomocí můžete provádět jednoduché, ale i velmi komplexní matematické výpočty. Existuje ve třech základních variantách: POSIX bc je původní a pevně definovaný bc jazyk, ze kterého se postupně vytvořily dialekty GNU bc a Plan 9 bc. Dnes je jednoznačně nejrozšířenější GNU bc, který naleznete zcela jistě ve své oblíbené distribuci.
Domovská stránka programu se nachází na webu FSF, kde můžete samozřejmě získat zdrojové kódy pod licencí GNU GPL. Díky naprosto minimálním nárokům na závislosti je možné bc provozovat na všech unixových systémech. Díky projektu GnuWin32 je možné bc provozovat i na MS Windows.
Pokud si chcete vše v tomto článku vyzkoušet bez instalace bc, můžete dokonce vyzkoušet plně funkční online variantu. Všechny zmíněné instalace GNU bc vycházejí z jedněch zdrojových kódů (aktuální je verze 1.06) a nabízejí shodné možnosti.
Jednoduché bc
Samotný příkaz můžete využít jak v řádkovém režimu, tak i v zajímavějším interaktivnějším. Na začátku můžeme využít především základní operátory jako součet (+), rozdíl (-), násobení (*) a dělení (/). Kromě toho tu máme také třeba zbytek po celočíselném dělení (%) nebo mocninu (^). Použití v řádce je jednoduché:
$ echo "(3+4)*7" | bc 49
Takto je možné utilitu využít například ve skriptech, kde potřebujeme jednoduše provádět složitější výpočty. Pro nás bude ale zajímavější interaktivní režim. K tomu přejdeme jednoduše tak, že příkaz spustíme bez parametrů.
Octneme se v jeho interaktivní konzole, ve které můžeme vytvářet základní výpočty. Příklad jako obvykle napoví nejvíce:
$ bc 4+7 11 5*5 25 14/7 2 (37-12)*3 75 quit
Vidíte, že jednoduché výpočty je možné provádět vlastně bez znalosti jazyka bc. Pokud chcete rychle spočítat několik čísel, jedná se o poměrně příjemnou cestu. Navíc si program pamatuje historii, ve které se můžete pohybovat pomocí kurzorových kláves, jak jsme na to zvyklí v shellu.
Mocnější bc
Jelikož se jedná o jazyk, pravděpodobně tušíte, že toho bude umět podstatně více. Základem jsou například proměnné, kterých je možné využít k ukládání výsledků a výpočty tak snadno řetězit a propojovat.
$ bc cislo=12*2 druhe=cislo+7 druhe 31 quit
Vidíte, že jsem do proměnné cislo
uložil výsledek výrazu 12*2
, pak jsem vytvořil další proměnnou a k výpočtu její hodnoty jsem využil první proměnnou. Výsledek jsem pak vypsal pouhým zapsáním názvu proměnné. V bc existuje ještě jedna speciální proměnná, kterou reprezentuje znak tečky. Tečka obsahuje výsledek posledního výpočtu.
$ bc 7+3 10 .-7 3 quit
Samozřejmě je možné tečku využívat jako každou jinou proměnnou a můžete s ní tedy provádět další výpočty. Zatím jsme si ukázali jednoduché celočíselné výpočty. Program bc ale dovoluje pracovat se zcela libovolnou přesností. Ta se řídí proměnnou scale
, která určuje, na kolik desetinných míst budou výpočty probíhat. Standardně je nastavena na nulu, takže je třeba ji v případě potřeby zvýšit.
& bc scale 7/4 1 scale=2 7/4 1.75 scale=10 7/3 2.3333333333 quit
Ještě mocnější bc
Celá syntaxe bc je odvozena od programovacího jazyka C. Můžete tak využívat i dalších obvyklých operátorů jako ++, --, +=, -=, *=, /=, ^= a %=.
$ bc a=10 a+=5 a 15 a-=9 a 6 a%=5 a 1 a++ 2 quit
Zároveň můžeme použít i operátory pro porovnání, jako je rovnost (==), méně (<), více (>), více nebo rovno (>=), méně nebo rovno (<=) či nerovnost (!=). Zároveň je možné porovnání kombinovat klasicky pomocí and (&&) či or (||). Pokud jste zvyklí na syntaxi C, budete se v bc cítit jako doma.
Hustodémonsky krutopřísné bc
Od jednoduché matematiky se pak můžete přesunout k samotnému programovacímu jazyku. My si z něj ukážeme jen malý kousek jako demonstraci ohromných možností bc. To zvládá například takové věci jako jsou cykly.
$ bc for(a=0;a<10;++a){ a; } 1 2 3 4 5 6 7 8 9 quit
Využít můžete ale také smyček, jako například while.
$ bc a=0 while(a<10{ a; void ++a; } 1 2 3 4 5 6 7 8 9 quit
V bc je možné definovat také vlastní funkce. Jejich zápis je opět velmi povědomý:
$ bc define funkce(a){ return(a * a); } funkce(3) 9 quit
Delší sekvence příkazů samozřejmě nemusíte zapisovat a spouštět přímo, ale můžete si je zapsat do textového souboru a jeho jméno pak předat bc jako parametr. Program se spustí a bude načítat obsah souboru řádek po řádce, jako byste vše znovu opisovali ručně.
A ještě dál
Tím jsme ani zdaleka nevyčerpali možnosti a schopnosti bc. Pomocí silného jazyka je možné vytvářet podstatně komplexnější programy. K dispozici jsou například funkce pro práci s datem a časem a další užitečné možnosti. Pro poslední ukázku jsem si vypůjčil příklad z jednoho pokročilejšího tutoriálu:
# addgrg yyyymmdd days - adds days to yyyymmdd and outputs new yyyymmdd if [ $# != 2 ] then echo "Not enough arguments" echo "Syntax addgrg yyyymmdd [-]days" exit fi bc < 0 ; ++m){ n = m(y,m); d -= n; } void --m; d+=n; g= (y*10000)+(m*100)+d; return(g); } /* convert gregorian (yyyymmdd) to julian(yyyyddd)*/ define j(g){ auto y,m,d,x,i,j; y=g/10000; m=(g/100) % 100; d=g%100; for(x=1;xi){ y+=1; d-=i; i=y(y); } while(d<1){ y-=1; i=y(y); d+=i; } r= (y*1000)+d; return(r); } /* add positive or negative days to a greg date - returns new date */ define a(g,a){ auto j,r; j=j(g); j=b(j,a); r=g(j) return(r); } /* call add to greg using the two command line arguments*/ a($1,$2) quit END-OF-INPUT
Tento ukázkový program umí pracovat s datem (ve formátu yyyymmdd) a dokáže k němu přičíst libovolný počet dnů. Jeho výstup pak vypadá takto:
addgrg 19980101 -1 19971231 addgrg 20000101 60 20000301 addgrg 20000101 59 20000229 addgrg 19000101 365 19010101 addgrg 20001231 -365 20000101
Výkonný, jak zrovna potřebujete
Výhodou bc je jeho opravdu široký záběr. Můžete jej považovat za příjemně jednoduchou kalkulačku s možností ukládání do proměnných, které podstatně zvyšují možnosti výpočtu. Můžete jej ale také brát jako komplexní prostředí pro složitou matematiku, které můžete zakomponovat do svých velkých skriptů. Tady máte nástroj. Využití je už na vás.