C2110 Operační systém UNIX základy programování 5. lekce Petr Kulhánek kulhanek@chemi.muni.cz Národní centrum pro výzkum biomolekul, Masarykova univerzita, Kotlářská 2, CZ-61137 Brno c2110 Operační systém UNIX a základy programování - 1 - Skriptování v jazyce bash > spouštění příkazů - návratová hodnota > cyklus pomocí while, příkaz test, aritmetické operace > cyklus pomocí for > cyklus pomocí for in > podmínky > příkazy expr, read, printf > přesměrování a roury > speciální proměnné > předávaní argumentů c2110 Operační systém UNIX a základy programování - 1 - T-. ^Spouštění i Končící proces může rodičovskému procesu sdělit informaci o svém průběhu pomocí návratové hodnoty. Návratová hodnota je celé číslo nabývající hodnot 0-255. rodičovský proces Proces: pid, ppid Proměnné dceřiný proces návratová hodnota Proces: pid, ppid Proměnné / Návratová hodnota: 0 = vše proběhlo úspešně > 0 = došlo k chybě, vrácená hodnota pak zpravidla identifikuje chybu c2110 Operační systém UNIX a základy programování - 3 - Návratovou hodnotu posledně provedeného příkazu lze zjistit pomocí proměnné ?. $ mkdir test $ echo $? 0 $ mkdir test mkdir: cannot create directory ^testl': File exists $ echo $? 1 c2110 Operační systém UNIX a základy programování - 4 - Syntaxe: while prikazl do prikaz2 done Příkaz prikaz1 a všechny příkazy v blOku d0/d0ne Kompaktní zápis: while prikazl; do prikaz2 • • • done c2110 Operační systém UNIX a základy programování - S - inicializace_pocitadla while test_pocitadla; do prikaz2 zvyseni_hodnoty_pocitadla done I=1 while test $I -le 10; do prikaz2 • • • I=$(($I+1)) done Vykoná prikaz2 desetkrát. • • • c2110 Operační systém UNIX a základy programování - e - Příkaz test slouží k porovnávání hodnot a testovaní typů souborů a adresářů. Porovnávání celých čísel: test cislol operand cislo2 Operand: -eq -ne -lt -le -gt -ge rovná se nerovná se menší než nenší než nebo rovno větší než větší než nebo rovno V případě, že je podmínka splněna, je návratová hodnota 0. Další informace: man bash, man test c2110 Operační systém UNIX a základy programování - 7 - Aritmetické operace s celými čísly lze vykonat v bloku (( ... )). Možné zápisy: i=$(( $i + 1 )) i=$(( i + 1 )) (( I = I + l )) (( I++ )) Zvýšení hodnoty proměnné I o jedna. Operátory: + * I % ++ 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) Další informace: man bash c2110 Operační systém UNIX a základy programování - B - Syntaxe: for((inicializace;test;zmena)) do prikaz2 done Kompaktní zápis: for((inicializace;test;zmena)); do prikaz2 • • • done inicializace whiletest; do prikaz2 • • • zmena done Příklad: for((I=1;I <= 10;I++)); do echo $I done c2110 Operační systém UNIX a základy programování - 9 - SVntaxe: Příkazy v bloku do/done (prikaz2, ...) se vykonají for var in list pro každý prvek v seznamu LIST. V daném běhu do cyklu obsahuje proměnná VAR aktuální hodnotu prikaz2 $VAR prvku. done Kompaktní zápis: for VAR in LIST; do prikaz2 $VAR • • • done Příklad: for A in a b c; do echo $A done c2110 Operační systém UNIX a základy programování - 10 - r i r Syntaxe: if prikazl then prikaz2 fi Kompaktní zápis: if prikazl; then prikaz2 fi if prikazl then prikaz2 • • • else prikaz3 fi if prikazl; then prikaz2 else prikaz3 fi Pokud prikaz1 skončí s návratovou hodnotou 0, vykoná se prikaz2. V opačném případě se vykoná prikaz3. • • • • • • • • • • • • • • • c2110 Operační systém UNIX a základy programování - 11 - stíkaz exhr vyíiodnocuje matematické výrazy, výsledky se tisknou do Příklady: $ expr 1 + 2 3 $ expr 2 \* 3 e I=1 while test $I -le 10; do prikaz2 • • • I=^expr $I + r done starndarníhouvsýsCszeautmxstíkdormjdeado uvozovek Další informace: man expr c2110 Operační systém UNIX a základy programování - 12 - Příkaz printf slouží k vypisování formátovaných textů. Syntaxe: printf [format] [hodnotal] [hodnota2] "Cislo %5d má hodnotu %G3d" _A_ do tohoto místa vlož hodnotul v daném formátu Další informace: man bash, man printf c2110 Operační systém UNIX a základy programování lB • • • j j j Formát: Příznak: G + Typ: d s f %[priznak][delka][.presnost]typ zarovnat doleva prázdné místo zaplnit nulami vždy uvést znaménko celé číslo řetězec (text) reálné číslo celková délka pole počet míst za desetinou tečkou (reálná čísla) Speciální znaky: \n - konec řádku \r - vrať se na začátek řádku %% - znak % Další informace: man bash, man printf c2110 Operační systém UNIX a základy programování - 14 - 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. Syntaxe: Příklad: echo "Zadej dve cisla oddělena mezerou:" read A B echo "Soucet je : $(($A + $B))" Pozor: nepoužívejte přikaz read ve spojení s rourami read A B read A # celý řádek se uloží do proměnné A # první slovo se uloží do proměnné A # zbytek řádku do proměnné B Nebude obsahovat hodnotu "text". Další informace: man bash c2110 Operační systém UNIX a základy programování - 15 - Čtení souboru po řádcích: cat soubor.txt | while read A; do prikaz2 • • • done while read A; do prikaz2 • • • done < soubor.txt roura Přesměrování do souboru: for((I=1;I <= 10;I++)); do echo $I done > soubor.txt přesměrování Výstup všech příkazů v cyklu je přesměrován do soubor.txt. c2110 Operační systém UNIX a základy programování - 1s - Proměnné: ? návratová hodnota posledního příkazu $ číslo procesu (PID) # počet argumentů 0 název spuštěného skritpu 1 ... 9 hodnoty argumentů 1 až 9 * všechny argumenty c2110 Operační systém UNIX a základy programování - 17 - $0 ./muj_skript $# 3 $l l0 $2 druha $3 ll $* lO druha ll PS meÄutné použít příkaz shift NA=$# for((I=1;I <= NA;I++)); do echo $1 shift done c2110 Operační systém UNIX a základy programování - lB - Cvičení c2110 Operační systém UNIX a základy programování - 19 - 7-1 ^Cvičení I A) Vypište deset písmen A vedle sebe na jeden řádek. B) Vypište deset písmen A, každé na jeden řádek. C) Upravte řešení A tak, že počet písmen zadá uživatel z klávesnice po spuštění D) Upravte řešení A tak, že se počet písmen zadá jako první argument skriptu. c2110 Operační systém UNIX a základy programování - 20 - 7-1 ^Cvičení I A) Vykreslete plný obdélník z písmen X. Rozměry obdélníku zadá uživatel pomocí argumentů skriptu. B) Upravte řešení A tak, že vykreslíte pouze obrys obdélníku. c2110 Operační systém UNIX a základy programování - 21 - Ti "Cvičení III A) 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. c2110 Operační systém UNIX a základy programování - 22 - 7-1 ^Cvičení I A) Napište skript implementující jednoduchou interaktivní kalkulačku. Skript se bude ptát na dvě čísla a operaci, která se s nimi má provést. Po zadání dat skript znázorní výsledek a zeptá se uživatele, zda-li chce pokračovat nebo skript ukončit. c2110 Operační systém UNIX a základy programování - 23 - 7-1 ^Cvičení Vysvětlete rozdílné chování následujících skriptů. Soubor data.txt obsahuje pět #!/bin/bash I=0 cat data.txt j while read A; do I=$(($I+1)) done #!/bin/bash I=0 while read A; do I=$(($I+1)) done < data.txt echo $I vypíše číslo O echo $I vypíše číslo 5 c2110 Operační systém UNIX a základy programování - 24 - 7-1 ^Cvičení ^ A) Soubor rst.out (wolfn:/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 = 2000 TIME(PS) = 2.000 TEMP(K) = 292.99 PRESS = 0.0 / čas teplota Průběh teploty znázorněte v programu gnuplot. POZOR: skript nesmí obsahovat příkazy grep, awk a ani jejich varianty ■ ■ i c2110 Operační systém UNIX a základy programování - 25 - 7-1 ^Cvičení A) Napište skript(y), který vytvoří sérii obrázků zobrazující vlnění (funkce sin. Video přehrajte pomocí příkazu mplayer. c2110 Operační systém UNIX a základy programování - 26 -