Příkaz expr Tvorba výrazu: • speciální znaky shellu se uvádějí do apostrofů • jednotlivé části výrazu se oddělují mezerou výraz1 ‘|’ výraz2 vrátí první výraz, pokud není nulový a není prázdným řetězcem, jinak vrací druhý výraz $ expr 3 + 4 '|' 5 7 $ expr 3 + -3 '|' 5 5 výraz1 ‘&‘ výraz2 vrátí první výraz pokud žádný z argumentů není nula nebo prázdný řetězec, jinak vrátí nulu
výraz1 relační_operátor výraz2 relační operátor: = ‘>’ ‘>=’ ‘<’ ‘<=’ != převede argumenty na celá čísla a provede celočíselné porovnání nebo lexikograficképorovnání pokud relace platí vrátí hodnotu 1 jinak 0 twoflower:~$ expr "a" '>' "b" 0 twoflower:~$ expr "a" '<' "b" 1 výraz1 relační_operátor výraz2 aritmetický operátor + - ‘*’ / % provede se převedení na celá čísla a příslušná operace, pokud převod není možný expr skončí chybou twoflower:~$ expr 7 % 5 2 twoflower:~$ expr 7 '*' 5 35
Stringy STRING : REGEXP Vrací jedna pokud string obsahuje regulární výraz REGEXP match STRING REGEXP Vrací jedna pokud string obsahuje regulární výraz REGEXP substr STRING POS LENGTH pos se počíta od 1 vratí podstring od pos o délce length twoflower:~$ expr substr "ABCDEFGHIJKLMNOPQ" 3 5 CDEFG index STRING CHARS index pozice znaku CHARS v STRING, pokud není 0 twoflower:~$ expr index "ABCDEFGHIJKLMNOPQ" D 4
length STRING délka STRING twoflower:~$ expr length "ABCDEF" 6
bc syntaxe: bc [ -lwsqv ] [long-options] [ file ... ] popis: podobnost s C zpracuje soubory na vstupu poté standardní vstup počítá s libovolně přesnými čísly Čísla dva atributy: length – délka čísla = počet číslic scale - počet míst za desetinnou tečkou číslice: 0-9 A-F – musí být použita velká písmena malá jsou brána jako název proměnné příklad: .000 001 length = 6, scale = 6 1234.567 length = 7, scale = 3
Proměnné Dva typy: jednoduché proměnné a pole Název proměnných začíná písmenem, všechny písmena musí být malá. Příklad: name name[1] 4 speciální proměnné: scale (default = 0 ) počet míst za desetinnou tečkou ibase, obase (default = 10) základ vstupu a výstupu (povolená hodnota ibase 2-16) last – poslední vypsané číslo Poznámka Pokud bude na vstupu větší číslice než je základ soustavy bere se vždy nejvyšší možná číslice dané soustavy, např.: ibase = 4 vstup FFF bc považuje za 333 Komentáře /* */ nebo řádek začínající #
Operace a výrazy Negace výrazu - expr Zvětšení (zmenšení) o jedna a výsledek výrazu je nová hodnota ++ var -- var Výsledek výrazu je hodnota proměnné ta je pak zvýšena (zmenšena) o jedna var ++ var -twoflower:~$ echo "a=8; a++" | bc 8 twoflower:~$ echo "a=8; ++a" | bc 9 Součet, rozdíl, součín a podíl dvou výrazů expr + expr expr - expr expr * expr expr / expr
expr % expr zbytek po dělění, výsledek má hodnotu scale jako operand s větší hodnotou scale expr ^ expr2 mocnina, mocnitel musí být celé číslo Nastavení priority ( expr ) Přírazení proměnné hodnoty výrazu var = expr Zkrácený zápis – ekvivalent "var = var
expr" , je operace var = expr twoflower:~$ echo "a=3; a *= 2; a" | bc 6
Porovnání expr1 < expr2 expr1 <= expr2 expr1 > expr2 expr1 >= expr2 expr1 == expr2 expr1 != expr2 Booleovské výrazy negace !expr and expr && expr or expr || expr Speciální výrazy Počet platných číslic length ( expression ) Čtení ze standardního vstupu read ( )
Počet číslic za desetinou tečkou scale ( expression ) Odmocnina (při záporném výrazu run-time error) sqrt ( expression )
Příkazy Jako oddělovač slouží středník a nová řádka. Výraz (expression) Plní jednu ze dvou fcí přirazení (" ...") a výstup. Po vypsání na výstup je výpsána i nová řádka. Dlouhá čísla se vypisují na více řádek, přerozdělení je jako poslední znak na řádek vypsán znak "\". Maximum znaků na řádek je 70. Poslední vypsaná proměnná je uložena do proměnné last (s tou je možné normálně pracovat). string
Cokoliv od znaku “ do znaku “,string je vypsán na výstup a poté je vypsán nový řádek. print list List je seznam výrazu a stringů určených na výstup, jako oddělovač slouží čárka. Speciální znaky (uvozeny „\”): "a" (alert or bell), "b" (backspace), "f" (form feed), "n" (newline), "r" (carriage return), "q" (double quote), "t" (tab), "\" (backslash). Jiný znak po „\” je ignorován { příkazy } Seskupuje příkazy k hromadnému provedení if ( výraz ) příkaz1 [else příkaz2] while ( výraz ) příkaz dokud je výraz nenulový provádí se příkaz
for ( [výraz1] ; [výraz2] ; [Výraz3] ) příkaz výraz1 se provede před smyčkou, výraz2 před každým provedením příkazu, výraz3 se provede před provedením výrazu 2, příkaz se provádí dokud je výraz2 nenulový break ukončí současný while nebo for cyklus continue přejde na další opakování for cyklu halt The halt statement (an extension) is an executed statement that causes the bc processor to quit only when it is executed. For example, "if (0 == 1) halt" will not cause bc to terminate because the halt is not executed. return Vráti nulu ve fci return ( expression ) Vráti hodnotu výrazu jako návratovou hodnotu fce
Pseudo příkazy limits Vypíše omezeni použité verze bc quit ukončí bc např.: "if (0 == 1) quit" ukončí bc Funkce define jmeno ( parametry ) { auto_list statement_list } auto_list je seznam lokálních proměnných,syntaxe deklarace je “auto name“ statement_list seznam příkazů příklad define d (n) { return (2*n); }
Matematické fce s (x) sinus c (x) cosinus a (x) arctg l (x) přirozený logaritmus e (x) exponenciální fce j (n,x) besselova fce
Příklady Rekurzivní počítání faktoriálu define f (x) { if (x <= 1) return (1); return (f(x-1) * x); } n^4 $ echo "define a (n) { for(a=2;a--;) n*=n; return (n) } b=2; c=a(b); c" | bc 16 $ echo "ibase=10; obase=2; 15" | bc 1111 $ echo "4 ^ 2" | bc 16
dc dc počíta s libovolně přčesnými čísly, počítá přes zásobník Syntaxe dc [-V] [--version] [-h] [--help] [e scriptexpression] [-expression=scriptexpression] [-f scriptfile] [-file=scriptfile] [file ...] Komentář Vše od znaku # do konce řádky Práce se zásobníkem Dvě základní operace: Pop – odebere prvek z vrcholu zásobníku Push – přídá prvek na vrchol zásobníku
Výstup p vypíše vrchol zásobníku a nový řádek $ echo "1 2 3 p" | dc 3 n vypíše vrchol a odebere jej $ echo "1 2 3 n n" | dc 32$ f vypíše zásobník každý prvek na nový řádek, prvky neodebírá! $ echo "4 5 6 f" |dc 6 5 4 Výpočty + Provede operaci 2x pop sečte získané hodnoty a s výsledkem provede push $ echo "1 2 3 + f" | dc 5 1
Provede operaci 2x pop odečte získané hodnoty a s výsledkem provede push * Provede operaci 2x pop vynásobí získané hodnoty a s výsledkem provede push / Provede operaci 2x pop vydělí získané hodnoty a s výsledkem provede push % Provede operaci 2x pop vydělí získané hodnoty a zbytek po dělění uloží do zásobníku. ~ Provede operaci 2x pop vydělí získané hodnoty a uloží výsledek celočíselného dělení a zbytek po dělění uloží do zásobníku. $ echo "1 11 3 ~ f" | dc 2 3 1
^ Provede operaci 2x pop – první hodnota je exponent, druhá základ ,hodnoty umocní a výsledek uloží do zásobníku. | vezme tři hodnoty ze zásobníku a1,a2,a3 výsledkem je (a3^a2) % a1. Příklad: $ echo " 10 2 98 | f" |dc 2 100 v Z98 je 2 v odmocnina Operace se zásobníkem c vymaže zásobník d duplikuje horní hodnotu zásobníku r prohodí první dvě hodnoty zásobníku $ echo "1 2 c 3 4 r d f" | dc 3 3 4
Registry Až 256 registrů, název registru je jeden znak. Slouží pro ukládání hodnot. sr vrchní prvek ze zásébníku se uloží do registru r lr hodnota z r seuloží do zásobníku Každý registr může být zásobníkem Sr Hodnota z hlavního zásobníku do zasobníku r Lr Prvek ze zásobníku r do hlavního $ echo "1 2 3 4 Sa Sb Sa Sb p La La f" | dc
dc: stack empty 4 2
Stringy Zápis do [] například: [abcdefg] a převede číslo naznak, pokud se již jedná o string zachová první znak $ echo "64 a p" | dc @ x provede string v zásobníku jako makro příklad: 2p provede výpis 2 na výstup a zápis do zásobníku $ echo "[2p] x f" | dc 2 2
Makra >r !>r r p" |dc 4 4 ? Přečte makro z terminálu a provede jej q uknčí makro a i makro ze kterého bylo předchozí voláno tj. pokud bylo makro ve kterem je q voláno přímo dojde k ukončení dc Q Ukončí tolik stupňů maker kolik je hodnota v zásobníku nemůže však ukončit dc
Dálší příkazy Z Nahradí číslo hodnotou počtu číslic. $ echo "1 22 333 Z f" | dc 3 22 1 X Nahradí číslo hodnotou počtu číslic za desetinou tečkou. $ echo "1 22 333.3334 X f" | dc 4 22 1 z počet prvků zásobníku před zavoláním z $ echo "1 22 333.3334 z f" |dc 3 333.3334 22 1