C2110 Operační systém UNIX a základy programování 7. lekce -1C2110 Operační systém UNIX a základy programování Petr Kulhánek, Jakub Štěpán kulhanek@chemi.muni.cz Národní centrum pro výzkum biomolekul, Přírodovědecká fakulta Masarykova univerzita, Kotlářská 2, CZ-61137 Brno CZ.1.07/2.2.00/15.0233 7. lekce C2110 Operační systém UNIX a základy programování 7. lekce -2- Obsah  Skripty • Skriptování v Bashi • Cyklus pomocí for a for in  ImageMagic • Konverze obrázků • Příkazy convert, display  Příkazy pro práci se jmény a cestami • dirname, basename C2110 Operační systém UNIX a základy programování 7. lekce -3- Skripty  Jak psát skripty  Cyklus pomocí for C2110 Operační systém UNIX a základy programování 7. lekce -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í 7. lekce -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í 7. lekce -6Cyklus pomocí 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í 7. lekce -7Cyklus pomocí 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í 7. lekce -8Cyklus pomocí 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í 7. lekce -9Cyklus a proměnné A=$A + 1 A = $A + 1 A=A + 1 A = A + 1 Změna počítadla: A=1 A = 1 Iniciace počítadla: A <= 10 $A <= 10 Podmínka: Je možné použít mezery mezi znakem =, jménem proměnné a její hodnotou. Je možné použít operátor $ pro přístup k hodnotě proměnné, ale není to zapotřebí. povolené zápisy for((I=1;I <= 10;I++)); do echo $I done benevolentnější pravidla platí pouze ve specifikaci cyklu zde již musí být operátor pro přístup k hodnotě proměnné C2110 Operační systém UNIX a základy programování 7. lekce -10- Cvičení 1. Napište skript, který vypíše cestu k aktuální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í 7. lekce -11Vnořování cyklů Řídící skupiny cyklů lze do sebe libovolně vnořovat. for((I=1;I <= 10;I++)); do for((J=1;J <= 10;J++)); do echo "$I $J" done done vnější cyklus vnitřní cyklus for((I=1;I <= 10;I++)); do for((J=1;J <= I;J++)); do echo "$I $J" done done počítadlo vnějšího cyklu může ovlivňovat chování vnitřního cyklu C2110 Operační systém UNIX a základy programování 7. lekce -12- Cvičení 1. Prakticky porovnejte funkci vnořených cyklů uvedených na předchozí straně. 2. Napište skript, který vypíše desetkrát deset znaků (dle vaší volby) na řádek. 3. Napište skript, který na první řádek vypíše jeden znak, na druhý řádek dva znaky, atd. a to celkem provede desetkrát. 4. Upravte první skript tak, aby vypsal patnáctkrát šest znaků na řádek. 5. Uveďte důvody proč je vhodné pro řídící hodnoty používat proměnné. POCET=10 for((I=1;I <= POCET;I++)); do echo $I done Řídící hodnoty je vhodné předávat pomocí proměnných: for((I=1;I <= 10;I++)); do echo $I done méně vhodné C2110 Operační systém UNIX a základy programování 7. lekce -13Image Magic  Konverze obrázků http://www.imagemagick.org (dokumentace, tutoriály, zdrojové kódy) C2110 Operační systém UNIX a základy programování 7. lekce -14- 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í 7. lekce -15- Skripty  Cyklus pomocí for in C2110 Operační systém UNIX a základy programování 7. lekce -16Cyklus pomocí 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 ze seznamu LIST. C2110 Operační systém UNIX a základy programování 7. lekce -17Cyklus pomocí 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í 7. lekce -18Příkazy pro práci se jmény a cestami  dirname  basename C2110 Operační systém UNIX a základy programování 7. lekce -19Pří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í 7. lekce -20- 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.