C2110 Operační systém UNIX a základy programování 8. lekce Petr Kulhánek kulhanek@chemi.muni.cz Národní centrum pro výzkum biomolekul, Přírodovědecká fakulta Masarykova univerzita, Kotlářská 2, CZ-61137 Brno )erační systém UNIX a základy programování Obsah > Skriptování v Bashi podmínky, cyklus pomoci while, vnořování řídících struktur > Nové příkazy printf, read, expr, test, exit )erační systém UNIX a základy programování Příkaz slouží k vypisování formátovaných textů a čísel. printf do tohoto místa vlož do tohoto místa vlož v daném formátu ační systém UNIX a základy programování Příkaz printf, příklady $ 1=10 $ B=12.345 $ printf "Hodnota proměnné I je %d\n" $1 Hodnota proměnné I je 10 $ printf "Zadané cislo B je %10.4f\n" $B Zadané cislo B je 12.3450 $ printf "Zadané cislo B je %010.4f\n" $B Zadané cislo B je 00012.3450 $ printf "Zadané cislo B je %+010.4f\n" $B Zadané cislo B je +0012.3450 $ printf "Cislo I je %-5d a cislo B je %.lf\n" $1 $B Cislo I je 10 a cislo B je 12.3 )erační systém UNIX a základy programování Příkaz printf, formát ] - volitelná část Příznak: 0 + Typ: %[priznak][delka][.presnost]typ zarovnat doleva prázdné místo zaplnit nulami vždy uvést znaménko d celé číslo s řetězec (text) f reálné číslo Speciální znaky: \n konec řádku \r vrať se na začátek řádku %% znak% počet míst za desetinou tečkou (reálná čísla) celková délka pole Další informace: man bash, man printf -5- [ Příkaz read Příkaz read slouží k čtení textu ze standardního vstupu a jeho uložení do proměnných. Příkaz načte vždy celý řádek, do první proměnné se uloží první slovo,do poslední proměnné se uloží zbytek řádku. Syntaxe: read A # celý řádek se uloží do proměnné A read A B # první slovo se uloží do proměnné A # zbytek řádku do proměnné B Příklad: echo -n "Zadej hodnotu: 11 read A echo "Zadaná hodnota je : $A" Pozor: nepoužívejte příkaz read ve spojení s rourami Aritmetické operace Aritmetické operace s celými čísly lze vykonat v bloku ((...)). Možné zápisy: hodnotu výsledku vypíše do (( 1 = 1 + 1 )) standardního výstupu (( I++ )) I=$(( $1 + 1 )) echo "Hodnota I zvětšena o jedna : $(( I + 1 ))" Operátory: v ■ v = přirazeni + sčítání odčítání násobení / dělení % zbytek po dělení ++ inkrementace (zvýšení hodnoty o 1) - dekrementace (snížení hodnoty o 1) Cvičení 1. Napište skript, který vypíše počet argumentů, které jste zadali při jeho spuštění. 2. Napište skript, který vypíše první zadaný argument skriptu ve formátu %4d. 3. Napište skript, který načte ze standardního vstupu číslo a to vypíše následujícím způsobem (bude uvedeno znaménko, pro výpis se použije pět míst, prázdné místa budou vyplněny nulami): Zadané cislo je : +0003 4. Co se stane, pokud skriptu ze cvičení 3, předložíte číslo: 123456? 5. Napište skript, kterému se budou předkládat dvě čísla jako argumenty. Skript tyto čísla vypíše a dále vypíše jejich součet. )erační systém UNIX a základy programování Aritmetické operace, příkaz expr Příkaz expr vyhodnocuje matematické výrazy, výsledky se tisknou do standardního výstupu. Příklady: \ zabrání expanzi speciálního znaku * na jména souborů a adresářů nacházejících se v aktuálním adresáři I=Nexpr $1 + 1N výsledek vložíme do proměnné I Další informace: man expr -9- Návratová hodnota příkazů může rodičovskému procesu sdělit informaci o svém průběhu pomocí . Návratová hodnota je celé číslo nabývající hodnot 0-255. Proces: pid, ppid - vše proběhlo úspěšně , vrácená hodnota pak zpravidla identifikuje chybu posledně provedeného příkazu lze zjistit pomocí proměnné >erační systém UNIX a základy programování Návratová hodnota, příklady $ mkdir test $ echo $? >erační systém UNIX a základy programování Příkaz test, celá čísla Příkaz test slouží k porovnávání hodnot a testovaní typů souborů a adresářů. V případě, že je test splněn, je návratová hodnota příkazu nastavena na 0. Porovnávání celých čísel: test cislol operand cislo2 Operand: -eq rovná se (equal) -ne nerovná se (not equal) -It menší než (less than) -le menší než nebo rovno (less or equal) -gt větší než (greater than) -ge větší než nebo rovno (greater or equal) Příkaz test, řetězce Porovnávání řetězců test retezecl operand řetezec2 Operand: == řetězce jsou identické != řetězce se liší Testovaní řetězců test operand retezecl Operand: -n testuje zda-li řetězec nemá nulovou délku -z testuje zda-li řetězec má nulovou délku -f testuje zda-li je řetězec název existujícího souboru -d testuje zda-li je řetězec název existujícího adresáře )erační systém UNIX a základy programování if prikazl then if prikazl then Pokud prikazl skončíš návratovou hodnotou 0, vykoná se prikaz2. V opačném případě se vykoná prikaz3. if prikazl then >erační systém UNIX a základy programování Příkaz exit Příkaz slouží k ukončení běhu skriptu nebo interaktivního sezení. Nepovinným argumentem přikazuje návratová hodnota. #!/bin/bash if -le 0 then vetsi nez nula!" "Cislo je vetsi nez nula." 0 $ ./muj skript 5 $ echo $? $ ./muj skript -10 Cislo neni vetsi nez nula!" 1 )perační systém UNIX a základy programování Cvičení 1. Napište skript, který ze standardního vstupu přečte dvě čísla. Skript tyto čísla vypíše a dále vypíše informaci, zda-li je první číslo vetší nebo menší než druhé (formát výpisu je ponechán na autorovi skriptu). 2. Napište skript, kterému se budou předkládat dvě čísla jako argumenty. Skript tyto čísla vypíše a dále vypíše jejich podíl. Pomocí podmínky ošetřete situaci zamezující dělení nulou. 3. Seznam souborů a adresářů, které se vyskytují ve vašem domovském adresáři uložte do souboru list.txt 4. Napište skript, kterému předložíte název souboru, jako argument. Skript otestuje, zda-li soubor existuje a pokud ano, tak vypíše jeho obsah a počet řádků, které soubor obsahuje. Funkčnost skriptu ověřte na souboru list.txt. )erační systém UNIX a základy programování -16- Cyklus pomocí while Cyklus (smyčka) je řídicí struktura, která opakovaně provádí posloupnost příkazů. Opakování i ukončení cyklu je řízeno podmínkou. cyklus probíhá dokud prikazl vrací v návratové hodnotě 0 iperační systém UNIX a základy programování Cyklus pomocí for versus while 1=1 $1 <= 10 I++ etho $1 * pokud je podmínka splněna, vykonají se příkazy v bloku do/done provede se před spuštěním cyklu (inicializace počítadla) test $1 echo $1 I=~expr $1 + 1~ aktualizace počítadla po vykonání příkazů >erační systém UNIX a základy programování Presmerovania roury read A roura přesměrování Výstup všech příkazů v cyklu je přesměrován do >erační systém UNIX a základy programování vnitřní cyklus Při návrhu skriptu se snažíme o zamezení zbytečného vnořovaní (převážně z důvodu snadnější orientace ve skriptu). Domácí úkol 1. Vykreslete do terminálu plný obdélník z písmen "X". Rozměry obdélníku zadá uživatel pomocí argumentů skriptu. 2. Upravte předchozí skript tak, že vykreslíte pouze obrys obdélníku. 3. Napište skript, který vykreslí dva pravoúhlé trojúhelníky v následujících orientacích. Délku odvěsny zadá uživatel po spuštění skriptu ze standardního vstupu. X X X XXX XXX X X X 4. Vykreslete kružnici nebo kruh z písmen X. Poloměr a to zda se má vykreslit kružnice či kruh zadá uživatel z klávesnice po spuštění skriptu. )erační systém UNIX a základy programování -21- Domácí úkol, II Vysvětlete rozdílné chování následujících skriptů. Soubor data.txt obsahuje pět řádků. vypíše číslo 0 vypíše číslo 5 perační systém UNIX a základy programování Domácí úkol, III Soubor rst.out (wolf.ncbr.muni.cz:/home/kulhanek/Data/rst.out) obsahuje výsledky z molekulové dynamiky. Úkolem je ze souboru vyextrahovat závislost teploty simulovaného systému na čase. NSTEP = Etot BOND 1-4 NB EELEC EAMBER 500 cas 942.6248 51.3204 17.7099 ■494 .7423 TIME(PS) = EKtot ANGLE 1-4 EEL E GB 0.500 TEMP(K) 151.0990 292.3619 981. 4071 -164.7991 288.02 EPtot DIHED VDWAALS RESTRAINT teplota PRESS 0.0 791.5258 176.5980 -68.3301 0 .1822 non-restraint) 791.3436 POZOR: Skript nesmí obsahovat příkazy grep, awk a ani jejich varianty. Při řešení použijte příkaz read a while. -23-