C2110 Operační systém UNIX a základy programování -1- C2110 Operační systém UNIX a základy programování 7. 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 C2110 Operační systém UNIX a základy programování -2- Obsah  Skriptování v Bashi skripty, cyklus pomocí for a for in, speciální proměnné  ImageMagic konverze obrázků  Nové příkazy convert, display, dirname, basename C2110 Operační systém UNIX a základy programování -3- Skripty C2110 Operační systém UNIX a základy programování -4Skript v Bashi #!/bin/bash # toto je komentar echo 'Toto je skript v interpretu Bash!' echo "Obsah adresare `pwd` je:" ls # vypise obsah adresare A=6 # nastaveni hodnoty promenne A echo "Hodnota promenne A je $A" echo "jeden prikaz"; echo "druhy prikaz" ./mujprikaz prvni_argument druhy_argument \ treti_argument pořadívykonávánípříkazů • prázdné řádky se ignorují • text uvozený znakem # se ignoruje (používá se ke komentovaní funkčnosti skriptu) • na jeden řádek lze uvést více příkazů, příkazy se oddělují středníkem ; • jeden příkaz lze napsat na více řádků pomocí zpětného lomítka \ ihned následuje nový řádek C2110 Operační systém UNIX a základy programování -5Spouštění skriptů v Bashi 1) Nepřímé spouštění Spouštíme interpreter jazyka a jako argument uvádíme jméno skriptu. $ bash muj_skript_v_bashi Skripty nemusí mít nastaven příznak x (executable). 2) Přímé spouštění Spouštíme přímo skript (shell automaticky spustí interpreter). $ chmod u+x muj_skript_v_bashi $./muj_skript_v_bashi Skripty musí mít nastaven příznak x (executable) a interpreter (součást skriptu). #!/bin/bash echo 'Toto je skript v interpretu Bash!' C2110 Operační systém UNIX a základy programování -6Cyklus pomoci for for((inicializace;podminka;zmena)) do prikaz1 ... done for((inicializace;podminka;zmena)); do prikaz1 ... done Kompaktní zápis: Cyklus (smyčka) je řídicí struktura, která opakovaně provádí posloupnost příkazů. Opakování i ukončení cyklu je řízeno podmínkou. provede se před spuštěním cyklu (inicializace počítadla) pokud je podmínka splněna, vykonají se příkazy prikaz1 a další aktualizace počítadla po vykonání příkazů C2110 Operační systém UNIX a základy programování -7Cyklus pomoci for, použití for((I=1;$I <= 10;I++)); do echo $I done for((I=10;$I >= 1;I--)); do echo $I done Vypíše čísla 10 až 1Vypíše čísla 1 až 10 Podmínka: Pokud lze proměnnou interpretovat jako celé číslo, lze použít následující porovnávací operátory: != nerovná se == rovná se < menší <= menší nebo rovno > větší >= větší nebo rovno Inicializace proměnné se řídí pravidly pro nastavovaní proměnných v Bashi. Proměnná I má roli počítadla. Změna: Pokud lze proměnnou interpretovat jako celé číslo, lze použít následující aritmetické operátory: ++ hodnotu proměnné zvýší o jedničku -- hodnotu proměnné sníží o jedničku další .... C2110 Operační systém UNIX a základy programování -8Cyklus pomoci for, změna počítadla Pokud lze proměnnou interpretovat jako celé číslo, lze použít následující aritmetické operátory: ++ hodnotu proměnné zvýší o jedničku A++ -- hodnotu proměnné sníží o jedničku A-- + sečte dvě hodnoty A=5 + 6 A=$A + 1 - odečte dvě hodnoty A=5 - 6 A=$A – 1 * vynásobí dvě hodnoty A=5 * 6 A=$A * 1 / vydělí dvě hodnoty (celočíselné dělení) A=5 / 6 A=$A / 1 += k proměnné přičte hodnotu A+=3 A+=$B -= od proměnné odečte hodnotu A-=3 A-=$B *= proměnnou vynásobí hodnotou A*=3 A*=$B /= proměnnou podělí hodnotou A/=3 A/=$B A=$A+3 C2110 Operační systém UNIX a základy programování -9- Cvičení 1. Napište skript, který vypíše cestu k aktuánímu adresáři a jeho obsah. 2. Vypište deset znaků A, každé na jeden řádek. 3. Vypište deset znaků A vedle sebe na jeden řádek (echo –n a manuálové stránky). 4. Napište skript, který vypíše sudá čísla od 2 do 100. 5. Napište skript, který vypíše mocniny 2n pro n od 0 do 32. Doporučení: Každou úlohu řešte v samostatném adresáři. Adresáře si očíslujte, např.: uloha01 uloha02 atd. C2110 Operační systém UNIX a základy programování -10Image Magic http://www.imagemagick.org (dokumentace, tutoriály, zdrojové kódy) C2110 Operační systém UNIX a základy programování -11- Příkazy animate, compare, composite, conjure, convert, display, identify, import, mogrify, montage, stream Přehled: Nejdůležitější příkazy: display zobrazí obrázek nebo sekvenci obrázků na obrazovce convert provede konverzi mezi různými formáty včetně různých typů operací jako je změna velikosti, ořezání, rozostření, apod. Detailní popis je dostupný v manuálových stránkách příkazů nebo na webové stránce Image Magic. Příklady: $ convert input.eps output.png zkonvertuje obrázek ve formátu postscript do formátu PNG Vysoká kvalita pro publikační účely: $ convert -density 300x300 input.eps -units PixelsPerInch \ -density 300 -background white -flatten output.png C2110 Operační systém UNIX a základy programování -12- Skripty C2110 Operační systém UNIX a základy programování -13Cyklus pomoci for ... in ... for VAR in LIST do prikaz1 $VAR ... done for VAR in LIST; do prikaz1 $VAR ... done Kompaktní zápis: Příkazy v bloku do/done (prikaz1, …) se vykonají pro každý prvek v seznamu LIST. V daném běhu cyklu obsahuje proměnná VAR aktuální prvek. C2110 Operační systém UNIX a základy programování -14Cyklus pomoci for ... in ..., seznamy for A in a b c; do echo $A done Cyklus proběhne třikrát, během toho postupně vytiskne znaky a, b, c. Seznamy položek je vhodné vytvářet programově (pomocí příkazů uvedených v obrácených apostrofech). for A in `ls *.eps`; do ./process_file $A done Příkaz process_file se vykoná pro každý soubor s příponou .eps, který se nachází v aktuálním adresáři. C2110 Operační systém UNIX a základy programování -15Nové příkazy C2110 Operační systém UNIX a základy programování -16Příkazy pro práci s jmény a cestami dirname vyextrahuje jméno adresáře z úplného jména souboru basename vyextrahuje jméno souboru z úplného jména souboru Příklady: $ basename /home/kulhanek/pokus.txt pokus.txt $ basename pokus.txt pokus.txt $ basename /home/kulhanek/pokus.txt .txt pokus $ dirname /home/kulhanek/pokus.txt /home/kulhanek $ dirname pokus.txt . Příkazy dirname and basename zpracovávají zadané informace bez ohledu na to, zda-li daný soubor či adresář existuje. C2110 Operační systém UNIX a základy programování -17- Cvičení 1. Vytvořte adresář obrazky 2. Do adresáře obrazky nakopírujte soubory z adresáře /home/kulhanek/Data/Snapshots/ , které mají zakončení .eps 3. Napište skript, který na obrazovku vypíše názvy souborů, které obsahuje adresář obrazky v následujícím formátu: Adresar obrazky obsahuje soubor: soubor1.eps Adresar obrazky obsahuje soubor: soubor2.eps .............................................................................. 4. Napište skript, který převede soubory ve formátu eps v adresáři obrazky do formátu png. 5. Ověřte příkazem display, že konverze proběhla v pořádku. C2110 Operační systém UNIX a základy programování -18Speciální proměnné C2110 Operační systém UNIX a základy programování -19Argumenty skriptu $ bash muj_skript_v_bashi arg1 arg2 arg3 $./muj_skript_v_bashi arg1 arg2 arg3 #!/bin/bash echo "Pocet zadanych argumentu: $#" echo "Prvni argument je: $1" echo "Druhy argument je: $2" echo "Vsechny zadane argumenty jsou: $*" echo "Nazev spusteneho skriptu: $0" 3 arg1 arg2 arg1 arg2 arg3 Použití a význam argumentů si určuje autor skriptu. ./muj_skript_v_bashi C2110 Operační systém UNIX a základy programování -20- Přehled Argumenty skriptu: # počet argumentů, se kterými byl skript spuštěn 0 název spuštěného skriptu 1 … 9 hodnoty argumentů 1 až 9, se kterými byl skript spuštěn * všechny argumenty, se kterými byl skript spuštěn Procesy: ? návratová hodnota posledně vykonaného příkazu (procesu) $ číslo procesu (PID) Pokud potřebujeme předat více jak devět argumentů, je nutné použít příkaz shift. Příkaz odstraní první argument ze seznamu argumentů. for((I=1;I <= $#;I++)); do echo $1 shift done Pokročilá práce s argumenty: Vypíše postupně zadané argumenty skriptu. C2110 Operační systém UNIX a základy programování -21- 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 znaky A vedle sebe. Počet vytisknutých znaků uživatel zadá jako první argument skriptu. 3. Napište skript, který vypíše PID procesu, ve kterém je skript interpretován. Za výpis vložte příkaz sleep, kterým vykonávání skriptu pozastavíte na 5 minut. Použijte příkaz kill v jiném terminálu k předčasnému ukončení vašeho skriptu.