Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás
7. Laboratóriumi gyakorlat: Vezérlési szerkezetek II. A gyakorlat célja: 1. A shell vezérlő szerkezetei használatának gyakorlása. A használt vezérlő szerkezetek: if/else/fi, for, while while, select, case, shift.
2. A ${} sztring operátorainak használata 3. A (( )) számításokat elősegítő szerkezet használata 4. a select szerkezet Előkészülethez szükséges anyag: a 6. és 7. előadás segédlete és a felhasznált parancsok kézikönyv lapjai illetve rövid leírásai. A gyakorlat menete: 1.A read parancs ..................................................................................................................................1 2.A while és until szerkezetek állomány végigjárásra..........................................................................2 3.A case szerkezet és a shift.................................................................................................................2 4.Sztring operátorok a ${} szerkezetben..............................................................................................3 5.Számítások a (( )) szerkezettel...........................................................................................................3 6.A select szerkezet .............................................................................................................................3
1. A read parancs Olvassuk át a read parancs kapcsolóit az előadás függelékéből vagy a héj help read segédletéből és végezzük el a következőket: a) Olvassuk be egy változóba az alábbi sorokat (külön-külön): a abc def abc def ghi
b) Olvassuk be két változóba ugyanazokat a sorokat. Mit tapasztalunk? c) Írjunk ki készenléti jelet (pl. "Írj be egy sort:") beolvasás előtt a read -el! d) Olvassunk be csak egy karaktert a read-el egy változóba úgy, hogy a read a beolvasás után azonnal térjen vissza a hívó héjba! e) Írjunk programot, amely végigolvas a read-el egy szöveges állományt úgy, hogy az állomány sorai külön-külön feldolgozhatóak egy while ciklus belsejében! f) Ellenőrizzük, mennyi a read visszatérítési értéke ha állomány vége jelet ütünk be olvasáskor ( ^D )?
1
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás
2. A while és until szerkezetek állomány végigjárásra Írjunk kis ciklusokat amelyek az alábbiakat valósítják meg: a) Olvassunk be sorokat a terminálról és írjuk vissza a sorok hosszát addig amíg EOF karakter ütünk be. Módosítsuk a programot úgy, hogy addig olvasson sorokat amíg egy kis a betűt ütünk be. Adjunk erre a feladatra 2 megoldást. b) Járjuk végig egy állomány sorait úgy, hogy egy olyan szkriptnek, amelyik while read line do #feldolgozás done
típusú feldolgozást tartalmaz a standard bemenetére egy szöveges állományt irányítunk. Végigjárás közben írjuk ki: 1.) a sorok számát a sorok elé és a sorokat 2.) a sorok számát és a sorban levő szavak számát a sorok elé c) Egy állomány sorait végigjárva találjuk meg a leghosszabb sort és írjuk ki a sor tartalmát és sorszámát az állományban a while ciklus befejeztével.
3. A case szerkezet és a shift a) Írjunk egy olyan szkriptet amely a case szerkezet segítségével írja ki nekünk, hogy milyen billentyűt ütöttünk be: betűt, számjegyet vagy egyéb karaktert. A program olvasson egy ciklusban egyenként karaktereket a read-el, addig amíg EOF jelet nem kap. b) A lista.txt (letöltés) állományban termékkódok és darabszámok vannak valamilyen raktári nyilvántartásból. Készítsünk egy héjprogramot, amely kódok szerint szétválogatja 3 állományba a sorokat: az elsőbe azok kerülnek, amelyeknél a kód P-vel kezdődik és kisbetűvel folytatódik valamint azok amelyek a kód Q-val kezdődik, a másodikba azok amelyek P-vel kezdődnek, második betűjük pedig szám, valamint azok amelyek R-el kezdődnek, a harmadikba azok amelyek P-vel kezdődnek és a második betűjük nagy betű. A három állomány neve 1.txt, 2.txt és 3.txt. Mindhárom végére oda kell még "ragasztani" egy sort, amelyben az szerepel, hogy az illető állományban hány sor van van. A program írja ki azt is, ha talál olyan sort, amelyet nem tud osztályozni.
2
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás
c) Teszteljük le a parancssor paramétereit a case struktúrával: milyen kapcsolók vannak rajta? Legyenek pl. -a, -b, -c kapcsolók egy program számára, és a -b kapcsolónak legyen egy kötelező paramétere. Például az alábbi programindításnál: prog.sh -a -b x -c arg1
a program írja ki:
a kapcsoló b kapcsoló és argumentuma x c kapcsoló az arg1 az elso kapcsoló nélküli argumentum
A kapcsolókat mindig az argumentumok előtt adjuk meg. Használjuk fel a shift parancsot is a tesztelés írásakor. d) Írjuk ki egy while szerkezettel a parancssor minden második paraméterét a shift -et használva.
4. Sztring operátorok a ${} szerkezetben Ismételjük át a sztring operátorokat (7. előadás 5. rész). 1. Írjuk be egy állomány teljes elérési útját egy változóba, pl: file='/home/eva/teszt.txt'
Írjuk ki echo paranccsal: -csak az állomány nevét -a könyvtár nevét amelyben található, teljes elérési úttal -az elérési utat alkotó könyvtárak nevét külön-külön -az állománynév kiterjesztését. 2. ( do_ren.sh ) Írjunk olyan programot amely átnevez minden .sh típusú állományt .bash típusúvá egy könyvtárban. Az állomány típus karakterláncának leválasztásakor használjuk fel a ${} belsejében alkalmazható karakterlánc operátorokat. A program legyen nagyon biztonságos: nehogy véletlenül is elvesztődjenek az állományok az átnevezés alatt. Általánosítsuk a feladatot, a program nevezzen át bármilyen típusú állományt bármilyen más típusúvá.
5. Számítások a (( )) szerkezettel 1. ( n123.sh ) Írjunk egy olyan szkriptet amelyik a terminálról olvas 2 számot (n1, n2), és utána n1 ciklust végez, mindegyik ciklusban beolvas egy harmadik számot (n3). Ha n3 egyenlő n2-vel hagyjuk abba a ciklust. 2. ( bytesum.sh ) Számoljuk ki egy szkripttel, hogy egy könyvtárban levő állományokban összesen hány byte és kilobyte van. 1 kilobyte-ot 1024 byte-nak számolunk, és a kilobyte-ok számát adjuk meg kerekítéssel.
6. A select szerkezet Tanulmányozzuk a héj select szerkezetét (7. előadás, 2. rész). 1. Írjunk egy szkriptet amelyik végigjárja egy adott könyvtár adott extenziójú állományait, miután egyet kiválasztott kiírja: 3
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás Kiválasztott fájl: test/1.txt
majd az alábbi kérdéseket teszi fel: 1) Törlés 2) Másolás 3) Átnevezés 4) Nincs művelet
A válasz után elvégzi a műveletet majd a következő fájlra lép. A fájlok végigjárását egy for ciklussal oldjuk meg, a művelet elvégzése után a select-ből break-el lépünk ki. A PS3 változót a "Művelet:" értékre állítjuk. A Törlés letörli a fájlt, a Másolás művelet egy backup nevű könyvtárba viszi a saját könyvtár alá. Az Átnevezés bekér egy nevet és átnevezi a fájlt úgy, hogy az új név ugyanabban a könyvtárban marad. A programot pl. így indítjuk: select_file.sh test txt
Működése, a test könyvtárban 3 fájl van: $bash select_file.sh test txt Kiválasztott fájl: test/2.txt 1) Törlés 2) Másolás 3) Átnevezés 4) Nincs művelet Művelet:1 Törlés művelet következik: removed `test/2.txt' Kiválasztott fájl: test/a.txt 1) Törlés 2) Másolás 3) Átnevezés 4) Nincs művelet Művelet:2 Másolás művelet következik: `test/a.txt' -> `backup/a.txt' Kiválasztott fájl: test/b.txt 1) Törlés 2) Másolás 3) Átnevezés 4) Nincs művelet Művelet:3 Átnevezés művelet következik: Új név:c.txt `test/b.txt' -> `test/c.txt' Vége, nincs több fájl $
4
Operációs rendszerek I. - UNIX felhasználói ismeretek és héjprogramozás
Az alábbi kód a szükséges select és for szerkezeteket tartalmazza, erre építhetjük a szkriptet: PS3='Művelet:' for f in do echo
$lista
#...itt előállítjuk a fájl listát...
#egy üres sor
echo Kiválasztott fájl: "$f" #itt a select szerkezet kezdete select op in Törlés Másolás Átnevezés "Nincs művelet" do echo $op művelet következik: #a REPLY változóban 1,2,3,4 van case $REPLY in 1) ;; # törlés 2) ;; # másolás 3) ;; # átnevezés 4) break ;; esac #művelet vége, kiugrunk break done done
5