C2110 Operační systém UNIX a základy programování 10. lekce / modul 2 -1C2110 Operační systém UNIX a základy programování 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 PS/2021 Prezenční forma výuky: Rev5 10. lekce / modul 2 C2110 Operační systém UNIX a základy programování 10. lekce / modul 2 -2Cykly a přesměrování C2110 Operační systém UNIX a základy programování 10. lekce / modul 2 -3Přesměrování a roury - vstup cat soubor.txt | while read A; do prikaz2 ... done while read A; do prikaz2 ... done < soubor.txt roura přesměrování 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: C2110 Operační systém UNIX a základy programování 10. lekce / modul 2 -4Přesměrování a roury - vstup cat soubor.txt | while read A; do { prikaz2 ... } < /dev/null done while read A; do { prikaz2 ... } < /dev/null done < soubor.txt 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 {}. C2110 Operační systém UNIX a základy programování 10. lekce / modul 2 -5Přesměrování a roury - výstup Přesměrování výstupu do souboru: for((I=1;I <= 10;I++)); do echo $I done > soubor.txt Výstup všech příkazů v cyklu je přesměrován do souboru soubor.txt. Roura: for((I=1;I <= 10;I++)); do echo $I done | 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. C2110 Operační systém UNIX a základy programování 10. lekce / modul 2 -6Přesměrování a roury - příklady for((I=1;I <= 10;I++)); do echo $I done > soubor.txt rm –f soubor.txt for((I=1;I <= 10;I++)); do echo $I >> soubor.txt done stejná funkcionalita for((I=1;I <= 10;I++)); do echo $I printf "N=%10d\n" $I done > soubor.txt rm –f soubor.txt for((I=1;I <= 10;I++)); do echo $I >> soubor.txt printf "N=%10d\n" $I done rozdílná funkcionalita C2110 Operační systém UNIX a základy programování 10. lekce / modul 2 -7Cvičení 1 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 skript vykreslující čtverec ze znaků "X ", 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. C2110 Operační systém UNIX a základy programování 10. lekce / modul 2 -8Domácí úkoly C2110 Operační systém UNIX a základy programování 10. lekce / modul 2 -9Domácí úkol Vysvětlete rozdílné chování následujících skriptů. Soubor data.txt obsahuje pět řádků. #!/bin/bash I=0 cat data.txt | while read A; do I=$((I+1)) done echo $I #!/bin/bash I=0 while read A; do I=$((I+1)) done < data.txt echo $I vypíše číslo 0 vypíše číslo 5