C2110 Operační systém UNIX základy programování 9. lekce / modul 2 PS/2020 Distanční forma výuky: Rev3 Petr Kulhánek kulhanek@chemi.muni.cz Národní centrum pro výzkum biomolekul, Přírodovědecká fakulta Masarykova univerzita, Kamenice 5, CZ-62500 Brno Dperační systém UNIX a základy programování 9. lekce / modul 2 Cyklus for... in Dperační systém UNIX a základy programování 9. lekce / modul 2 Cyklus pomocí for... in ... Příkazy v bloku do/done (prikazl,...) 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. for VAR in LIST do prikazl $YAR done • • • Kompaktní zápis: for VAR in LIST; do prikazl $VAR • • • done Dperační systém UNIX a základy programování 9. lekce / modul 2 -3- Cyklus pomocí for... in seznam 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 xls *.epsx; 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. for A in x seq 1 0.25 10x; do printf "%8 .3f\n " $A done Vypíše reálná čísla v intervalu od 1 do 10 s přírůstkem 0,25. Čísla budou uvedeny s přesností tří desetinných míst a zarovnány doprava v poli o délce 8 znaků. Dokumentace: man seq Dperační systém UNIX a základy programování 9. lekce / modul 2 Cvičení 1 1. Napište skript, který vypíše reálná čísla v intervalu od -10 do 10 s přírůstkem 0,5. Čísla budou uvedena včetně znaménka, zarovnány doprava v poli 10 znaků a uvedeny s přesností na jedno desetinné místo. 2. Napište skript, který pro každý soubor *.cpp v adresáři /home/kulhanek/Documents/C2110/Lesson09/datal vypíše název souboru a počet řádků, které obsahuje. V řešení použijte for... in a pro výpis souborů použijte příkaz Is. 3. Upravte předchozí script tak, aby pro každý soubor *.f90 v adresáři /home/kulhanek/Documents/C2110/Lesson09/data2 vypsal název souboru a počet řádků, které obsahuje. V řešení použijte for... in a pro výpis souborů použijte příkaz find. Dperační systém UNIX a základy programování 9. lekce / modul 2 Cykly a přesměrování Dperační systém UNIX a základy programování 9. lekce / modul 2 Přesměrování a roury - vstup Pomocí roury nebo přesměrování je možné do cyklu předat vstupní data. Typické použití je načítaní souboru/vstupního proudu po řádcích: cat soubor.txt | while read A; do prikaz2 • • • done while read A; do prikaz2 • • • done < soubor. txt roura presmerovaní Dperační systém UNIX a základy programování 9. lekce / modul 2 Přesměrování a roury - vstup Vstup může být "konzumován" příkazy v bloku cyklu. Tomu je možné zabránit přesměrování standardního vstupu z /dev/null pro blok příkazů uvedených do {}. cat soubor.txt | while read A; do { prikaz2 } < /dev/null done while read A; do { prikaz2 } < /dev/null done < soubor.txt Dperační systém UNIX a základy programování 9. lekce / modul 2 Přesměrování a roury - výstup Přesměrování výstupu do souboru: for((I=l;I <= 10;I++)); do echo $1 done > soubor.txt Výstup všech příkazů v cyklu je přesměrován do souboru soubor.txt. Roura: for((I=l;I <= 10;I++)); do echo $1 done I tee soubor.txt Výstup všech příkazů v cyklu je spojen se standardním vstupem příkazu tee. Ten jej vytiskne na standardní výstup a zároveň uloží do souboru soubor.txt. Dperační systém UNIX a základy programování 9. lekce / modul 2 -9- Přesměrování a roury - příklady for((I=l;I <= 10;I++)); do echo $1 done > soubor.txt for((I=l;I <= 10;I++)); do echo $1 printf "N=%10d\n" $1 done > soubor.txt stejná funkcionalita rm -f soubor.txt for((I=l;I <= 10;I++)); do echo $1 » soubor.txt done rozdílná funkcionalita rm -f soubor . txt for((1=1;I <= = 10;I++)); do echo $1 » soubor. txt printf "N=%10d\n" $1 done Dperační systém UNIX a základy programování 9. lekce / modul 2 Cvičení 2 1. Napište skript, který pro každý soubor *.f90 v adresáři /home/kulhanek/Documents/C2110/Lesson09/data2 vypsal název souboru a počet řádků, které obsahuje. V řešení použijte rouru s while read a pro výpis souborů použijte příkaz find. 2. Upravte skripty vykreslující obrazce (L08.M01.C01), tak aby se rozměr obrazce načítal ze standardního vstupu a výsledný obrazec se tisknul do souboru, jehož jméno zadá uživatel opět ze standardního vstupu. Dperační systém UNIX a základy programování 9. lekce / modul 2 -11- Domácí úkoly Dperační systém UNIX a základy programování 9. lekce / modul 2 Domácí úkol I Vysvětlete rozdílné chování následujících skriptů. Soubor data.txt obsahuje pět řádků. #!/bin/bash 1 = 0 cat data.txt | while read A; do I=$( ($1 + 1) ) done vypíše číslo 0 #!/bin/bash 1 = 0 while read A; do I=$( ($I + D ) done < data.txt echo $1-----' výpise cislo 5 Dperační systém UNIX a základy programování 9. lekce / modul 2 Domácí úkol II Soubor rst.out (home/kulhanek/Documents/C2110/Lesson09/rst.out) obsahuje výsledky z molekulové dynamiky. Úkolem je ze souboru vyextrahovat závislost teploty simulovaného systému na čase a tyto data uložit do souboru temp.out, který bude obsahovat právě dva sloupce. První sloupec bude čas a druhý sloupec bude teplota. cas NSTEP = Etot BOND 1-4 NB = EELEC = 500 TIME (PS) 942.6248 51.3204 17.7099 -494 .7423 EKtot ANGLE 1-4 EEL EGB 0.500 TEMP(K) 151.0990 292.3619 981.4071 -164.7991 EAMBER (non-restraint) 791.3436 teplota 288.02 PRESS EPtot DIHED VDWAALS RESTRAINT 0.0 791.5258 176.5980 -68.3301 0.1822 POZOR: Skript nesmí obsahovat příkazy grep, awk a ani jejich varianty. Při řešení použijte příkaz read a while. Dperační systém UNIX a základy programování 9. lekce / modul 2