Shell script feladatok:
Követelmények
A program működése feleljen meg a UNIX
alapelveinek, amit kell, azt csinálja megbízhatóan, minden sallang nélkül. Ha
nem tudja értelmezni argumentumait, akkor valami ehhez hasonló módon
tájékoztasson:
$>ls -G
ls: Not a recognized flag: G
Usage: ls [-1ACFLNRabcdefgilmnopqrstux] [File...]
A *-gal jelölt feladatok kivételével minden
feladatnak futnia kell UNIX és Debian alatt is. Használja a szabványos ki- és
bemeneti fájlokat, a működésének ne legyenek mellékhatásai. (pl. ne hagyjon
maga után szemetet, stb.).
A programhoz szükséges minden inputot
argumentumként adjon át, és a program ellenőrizze is le az összes megadott
argumentumot. (darabszám, típus, stb.)
A programhoz írjon rövid helpet (hívható
legyen a programnév –h kapcsolóval), ami rövid
tájékoztatást ad a működésről, a szükséges argumentumokról, kapcsolókról, azok
típusáról stb.
Használjon „beszédes” változóneveket és megfelelő
kommentárral lássa el a programot. (A megfelelő nem azt jelenti, hogy minden
programsort 4 másikban magyaráz meg!)
A próbák során ne vagy csak engedéllyel zavarjon másokat! Erre bizonyos feladatoknál külön is felhívjuk a figyelmet.
Egyes feladatkiírások végén szerepel egy-egy példa arra, hogy a futó programnak milyen outputot kell produkálnia.
Ha a feladatnév/feleadtszám után (... fo)
szerepel, akkor a feladatot a megadott számú hallgatókból álló csoport is
választhatja. (Ez nem kötelező, 1 hallgató is megoldhat 2-3 főre kiírt feladatot.)
1. HTML szintaktika ellenőrző
Írj egy html-szintaktika ellenőrző
programot, mely ellenőrzi a nyitó illetve záró TAG-eket. A program próbálja
megállapítani a hiba helyét! Ismerje a fontosabb TAG-eket, és ha hibás TAG-gel
találkozik, kérdezze meg, hogy kijavítsa-e. Könnyen bővithető legyen új
szintaktikai elemekkel. Ellenőrizze az argumentumban megadott file nevét is, és
hogy létező, olvasható text file-e.
pl.:
$>htmlell file
Hianyzik a </html>
Atnevezzem-e file.html -re?
I/N
2. C program szintaktika ellenőrző
Írj egy C program szintaktika ellenőrző
programot, ami ellenőrzi az if, case stb. feltételek, elágazások
szintaktikáját; továbbá a meghívott függvények meglévőségét; valamint a
zárójelek ki illetve bezártságát. Az argumentumban megadott fájlnak létező,
olvasható text-fájlnak kell lennie.
Pl.:
$>cell file
Hibas a 25. sorban levo if
3. Filmfelirat konvertáló (3 fő)
Filmfelirat konvertáló és módosító program.
Argumentumban megadott feliratfájl konverziót hajt végre, argumentumban
megadott argumentum alapján. Képes legyen kétfajta felirat közül oda-vissza
konvertálni (srt-sub), valamint a subot nyújtani-zsugorítani, tolni, valamint
két tetszőlegesen megadott sor alapján (célszerűen az elejéről és a végéről)
átszámolni az összes többi sort. Az fps-t (frame per secundum) kérje be. Az
első argumentum a konverzió típusát határozza meg, utána a konvertálandó
feliratfájlt adjuk meg, amit ellenőrizni kell (létező, olvasható textfájl
legyen). A harmadik argumentum a módosítás mértéke (ha szükséges). Utolsó
argumentum a kimeneti file legyen. Ez az argumentum opcionális, ha nincs
megadva, akkor az output fájl neve legyen az input fájlnév egy "uj"
szócskával kiegészítve. Ahol argumentumként számot vár ellenőrizzük, hogy
valóban szám legyen.
Pl1.:
$>felirat konv dune.srt
$>cat dune.srt
1
00:01:11,840 --> 00:01:13,280
Arrakis.
2
00:01:13,680 --> 00:01:14,800
Dűne.
$>cat dune.sub
{1796}{1832}Arrakis.
{1842}{1870}Dűne.
Pl2.:
$>felirat tol felirat.sub -2
2 sec tol viszafele (output file: feliratuj.sub)
Pl3.:
$> felirat nyujt felirat.sub 1.18
nyujtja a feliratot 1.18 szorosára. (29.5/25) (output file: feliratuj.sub)
Pl4.:
$> felirat igazit felirat.sub modosit
$> cat felirat.sub
{1796}{1832}Arrakis.
{1842}{1870}Dűne.
....
{90012}{90045}Örömmel.
$> cat modosit
{1821}{1857}Arrakis.
{106239}{106278}Örömmel.
$> cat feliratuj.sub (úgy nyújtja és tolja, hogy a két sor megegyezzen, a többi)
{1821}{1857}Arrakis. (pedig hozzá igazodik)
{2189}{2231}Dűne.
....
{106239}{106278}Örömmel.
4. Bejelentkezési statisztika
Argumentumban adott felhasználó
bejelentkezéseiről ad információt. Legutolsó bejelentkezése, mikor, honnan
történt, összesen mennyi időt töltött bent, bejelentkezésenként átlagosan
mennyi időt töltött bent, naponta átlag hányszor jelentkezik be, és naponta
átlagosan mennyi időt tölt el azon a gépen. Írja ki azt a 10 gépet, ahonnan a
legtöbb bejelentkezése történt. Ha dátumot adunk meg argumentumnak, akkor
kiírja, hogy abban az időpontban kik voltak bejelentkezve (loginnév + teljes
név formában).
Pl1.:
$>bejelent user1
$>Utolso bejelentkezés: Mar 05 15:45 - 15:49
gépnév: nec21.iit.uni-miskolc.hu
...
Pl2.:
$>bejelent 03:05:15:46
Marcius 5.-én 15 óra 46 perckor bent tartózkodott:
user1 Kis Miska
user2 Nagy Góliát
...
5. Naptár
Írj egy programot, ami emlékeztetőként
kiírja az argumentumban megadott dátumon lévő névnapot, paraméter nélkül
indítva az aktuális napra vonatkozik. Továbbá előre meghatározott napra előre
szól, hogy valami fontos esemény lesz hh.nn dátumon. Célszerűen 12 fájlba
szervezve, soronként megadni a napokat, az egyes mezőkben a névnapok,
születésnapok, egyéb események felsorolása, amennyiben nem egy nappal előre
kérjük az emlékeztetést, akkor speciális karakterek közé zárva, hogy hány napra
előre. Példa az adatfájlra:
$>cat jun
1:Tunde
2:Kármen:Anita:Brigi szuletesnapja! {3}
....
(3 nappal előre jelzi a 2.-ai születésnapot, és 2.-án a két névnapot is)
6. Tantárgynapló
Írj tantárgynapló programot, ami egyik
fájlban a tantárgyakat tartja nyilván, a másik fájlban a nevet és tankört,
valamint a tárgyak eredményeit az előző fájlban meghatározott sorrend szerint.
A "rekordok" névsor szerint legyenek rendezve. Egy egyszerű menüvel
lehessen lekérdezni, új adatot felvinni, törölni, ill. módosítani, valamint átlagot
számolni.
Így nézhet ki például az egyik adatfájl
egy sora:
$> cat adatok
Kiss Janos:G-111:2:3:4:5:3:2:5:2:3:4:5
7. Sin – cos számítás
Írj programot, ami argumentumban megadott
számnak kiszámolja a szinuszát, illetve koszinuszát, Taylor sorbafejtéssel.
Harmadik argumentumban megadható legyen a sorbafejtésnél figyelembe vett tagok
száma. Ez alapértelmezettként 3.
Pl.:
$>szog sin 30 5
sin 30 fok = …
8. Arcsin –arccos számítás
Írj programot, ami argumentumban megadott
számnak kiszámolja az arcus sinusat illetve arccosinusat, Taylor sorbafejtéssel
Harmadik argumentumban megadható legyen a sorbafejtésnél figyelembe vett tagok
száma. Ez alapértelmezettként 3.
Pl.:
$>szog arcsin 0.5 5
arcsin 30 fok = …
9. Sh – ch számítás
Írj programot, ami argumentumban megadott
számnak kiszámolja a sh-ját illetve ch -ját, Taylor sorbafejtéssel. Harmadik
argumentumban megadható legyen a sorbafejtésnél figyelembe vett tagok száma. Ez
alapértelmezettként 3.
Pl.:
$>szog ch 30 5
ch 30 fok = x
10. Családfa
Írj programot, amely családfát tart
nyilván. Mindenkiről tartsa nyilván az alábbi adatait: születési idő/hely),
halálozási idő, lakcím, anyja, apja, gyerekei neve, felesége(i)/férje(i) neve
(többszöri házasságot is tudjon kezelni). Célszerűen minden személyt egyedi
azonosítóval érdemes ellátni. Egyszerű menüvel lehessen nézegetni az adatokat.
Egyszerre egy egyénről írjon ki minden információt. A program elindítása után a
fájlban az első egyént listázza ki elsőnek. Különböző billentyűk lenyomására
lehet a többi adatot megtekinteni. (pl.: "a" billentyű lenyomására az
egyén anyja, "1" billentyű lenyomására az első gyermeke, "f"
férj/feleség stb….). Ezekről az egyénekről is le lehessen kérni az összes
meglévő adatot. A program tegye lehetővé a keresést az adatbázisban. Egyéni
ötlet alapján több adatot is kezelhet.
Pl.:
$>csalad
Név:Kiss János
Anyja neve:Nagy Borbala
Apja neve:Kiss Bela
Szuletett:1912.12.12. Kisnagyfalva
Lakcim:9876. Nagykisfalva, Kisvasut ut. 11
Felesége neve:Nagy Krisztina
1. gyereke neve: Kiss Krisztina
2. gyereke neve: Kiss Borbala
3. gyereke neve: Kiss Miklos
11. Egyszerű levelező kliens
Készítsen olyan shell programot,
amely egy primitív levelező klienst valósít meg. A programban menün keresztül
legyen lehetőség levelek olvasására, egy adott levél megválaszolására, és új
levél írására. A program a levelek olvasásakor írja ki az összes kapott levél
feladóját, és ez alapján legyen lehetőség a levelet elolvasni, illetve
válaszolni a levélre. A levélküldésnél legyen lehetőség megadni a címzettet, a
levél címét, csatolt fájlokat és természetesen a levél szövegét.
12. Figyelő-program
Készítsen olyan sh scriptet, amely
a háttérben futva figyelni, hogy ki lépett be a rendszerbe. A program
használjon egy fájlt, mely tartalmazza a figyelni kívánt felhasználók
loginnevét. Ha az adott user belép, akkor egy pop-up ablakban jelenjen meg,
hogy az illető belépett, ezen felül az is kerüljön kiírásra, hogy melyik gépre
jelentkezett be, és az hogy mikor tette ezt pontosan.
13. Log fájl elemző
A sh program tudjon legalább 2 típusú log fájlt elemezni és olvashatóbb formában kiírni. Kapcsolón keresztül
lehessen a típusok között választani. A két típus legyen például: apache.log és egy apache error.log.
14. Hírfeldolgozás
Az sh script legalább 3 weboldalról
gyűjtse össze a hírek főcímét (linkjét) és írja ki a híreket olyan formában,
hogy forrás : hír Lehetőség szerint a forrást más színnel jelenítse meg
15. C daraboló (2 fo)
A sh program adott C forrást tudjon
feldarabolni a házi szabványnak megfelelően és készítsen hozzá Makefile-t is. A
C forrás feldarabolásra vonatkozó szabályokat a házi szabványban lehet
elolvasni. Tehát a függvények a main kivételével kerüljenek külön fájlba, és
készüljön egy olyan Makefile is, ami gondoskodik a fordításról linkelésről stb.
16. Levél figyelő
Az sh alkalmazás a háttérben futva
figyeli a felhasználó mailbox-át, és ha új levele érkezik egy pop-up window-ba
(jelenjen meg) írja ki, hogy levele érkezett. Írja ki, hogy kitől és hogy
mikor. Legyen lehetőség egy mail kliens indítására is.
17. Debian csomagok listája *
Debian alatt kérdezze le, mely
csomagok vannak telepítve a gépre, írja ki ezen csomagok nevét formázottan,
valamint azt is írja ki a program, hogy mely programokkal van függőségben egy
adott csomag. Pl.
nparted : libc6, libnewt0, libparted1.4, libuuid1
nano : libc6, libncurses5
18. Levél Script (2 fő)
A program háttérben futva figyelje a
beérkező leveleket, ha a levél subject-je egy bizonyos előre (argumentumban)
megadott szöveg, akkor a levél tartalmát az sh shell scriptnek veszi, azt
végrehajtja, az outputját pedig elkapva visszaküldi a feladónak. A próbák során
ne zavarjon másokat!
19. Deriválás (2 fő)
Írj programot, ami argumentumban megadott
kifejezésnek kiszámolja a deriváltját. A program tudja kezelni az alábbi
műveleteket, fogalmakat: osztás, szorzás, polinomok, sin, cos, zárójelezés.
Pl:
$>deriv sin^2((x^2-3x-5)/4)
$>0.5*sin((x^2-3x-5)/4)*(2x-6)
$>deriv sin^2((x^2-3x-5)/4)*cos(x^3-1)
20. Körlevélküldés
A program tegyen lehetővé egy egyszerű
körlevélküldést. A címlistát egy (megfelelő szerkezetű) adatfájlból vegye a
program. Az elküldendő levélben speciális karakterek jelölik a kiegészítendő
részeket. A megfelelően megírt mintaállományba a program a felhasználói
nevektől függően helyettesít be szövegrészeket. A próbák során ne zavarjon
másokat!
$>cat
mintalevel.1
Kedves ##1##!
A …….. ##2##…..
….
$>cat lista.1
user1@valahol.van.hu Szabo Pal febr.24.
user2@……
$>korlev
mintalevel.1 lista.1
21. Fájlkereső
A program valósítson meg fájlkeresést.
Mondja meg a keresett fájlról, hogy létezik-e, mi a típusa, mérete és ki a
tulajdonosa. A program először egy adatbázisban keres, amennyiben ott nem
találja a keresett fájlt, akkor a teljes fájlrendszert végignézi. (Az adatfájl
elérési útvonalakat tartalmaz.) A keresés eredményének megfelelően bővítse az
adatbázist. A program tegye lehetővé az adatbázis explicit bővítését is,
például a script valamilyen (pl. –u) kapcsolóval való meghívásával.
$>fkeres myfile
$>A file eleresi utvonala:/etc/usr/bin/group1/valaki3/myfile
Tipusa: ascii text
Tulajdonosa: Buga Jakab
Merete: 4588 bytes
22. Számológép
A shell script valósítsa meg egy számológép funkcióit. Végre tudja hajtani az alábbi műveleteket: összeadás,
kivonás, osztás, szorzás, hatványozás, gyökvonás (nem csak négyzetgyök!). Tudjon értelmezni zárójeles kifejezéseket,
és jelezze, ha szintaktikai hiba van a megadott argumentumban.
Pl.:
$>calc
(33.45/(78*(12.5))
Zarojelezesi hiba! Kerem ellenorizze a nyito es zaro zarojeleket!
$>calc
(33.45^3-(57-3.2)/(78*(12.5^(-1.2))))
37413
23. Bejelentkezési statisztika 2.
A shell script szűrje a last parancs eredményét, és írja ki
hallgatókat csökkenő/növekvő sorrendben az alapján, hogy hányszor jelentkeztek
be. Egy másik kapcsolóval azt írja ki, hogy mennyi időt töltöttek el összesen
az adott gépen (szintén növekvő/csökkenő sorrendben listázva). Meg lehessen
adni, hogy hány darab felhasználót listázzon ki.
Pl.:
$>gepido -p n 2
user1 Kiss Jozsef 25 login
user2 Nagy Pal 23 login
$>gepido -t cs 2
login name day:hour:min min
user2 Nagy Pal 01:22:18 3778
user1 Kiss Jozsef 01:12:36 3296
24. Levelezőlista
A shell script automatikusan továbbítsa a beérkező leveleket a levelezési listára
feliratkozott felhasználóknak. Valósítsa meg az automatikus fel- és
leiratkozásokat is. A próbák során ne zavarjon másokat!
25. Szamrendszerek kozotti konvertalas
A parameterkent kapott szamot valtsa at 2-es, 8-as, 10-es vagy 16-os szamrendszerbe. A forras es cel szamrendszert
kapcsolokkal lehessen megadni. Jelezze ha ervenytelen a megadott szam az adott szamrendszerben. A hibakat jelezze,
pl. nem megfelelo parameterezes, stb. Legyen alapertelmezett forras es cel szamrendszer.
Pl.:
&./szamvalt.sh -f 2 -c 10 1001
9
&./szamvalt.sh -f 16 -c 10 FF
255
&./szamvalt.sh -f 10 -c 16 127
7F
26. Felhasznalo menedzsment
A shell script az argumentumkent kapott parancs alapjan ertelmezze a tobbi parameteret. A parancs lehet listazas, hozzaadas,
torles, zarolas, engedelyezes, jelszovaltas, shellvaltas. A felhasznalokat egy fileban tarolja, olyan strukturaban, mint az /etc/passwd
file UNIX rendszereken. Hozzadaskor a szukseges adatok: felhasznalonev, valos nev, homedir, shell, jelszo.
Ha valamit nem adott meg argumentumkent, akkor azt kerje be a script. A jelszo-t hashelni kell (DES vagy MD5)!
A felhasznaloi (uid) es csoport azonositokat (gid) 1000-tol kezdve ossza ki mindenkinek egy egyedit. Torleshez
a felhasznalonevet kelljen megadni. Zarolasnal a jelszo hash ele egy * keruljon. Minden tranzakciot naplozzon egy kulon
fileba!
pl: felhasznalok.db file egy sora:
kamm:$1$9ZiP3z2a$U5Tbm7l.2Rn2ZlnCeK1Ma0:1000:1000:kamm,,,:/home/kamm:/bin/bash
27. Menetrend
Mondja meg a script, hogy mikor indul a legkozelebbi harom 22-es illetve 31-es busz az egyetemrol.
Parameterkent lehessen megadni tetszoleges idopontot, olyankor ahhoz viszonyitson ne az aktualis idohoz.
Kezelje le azt az esetet is ha mar csak masnap hajnalban indul busz. Illetve adjon tanacsot, hogy elerjuk-e
a buszt, attol fuggoen, hogy hol vagyunk. A tartozkodasi helyunket is parameterkent kapja a szkript, legalabb
a kovektezo heylszineket ismerje a program: "infoban", "rockyban", "menzan", "rockybanittasan", "koliban".
Ha idopontnak "frissites"-t adunk meg, akkor a menetrend frissuljon webrol (mvkzrt.hu)!
28. Kozos koltseg nyilvantarto
Kepzeld magad Vagasi Feri helyebe es irj Kutya ur szamara egy olyan shell scriptet, ami segiti ot kozos koltseg nyilvtantartasaban.
A shell script az argumentumkent kapott parancs alapjan ertelmezze a tobbi parameteret. A parancs lehet listazas, hozzaadas,
torles, modositas, ujhonap. A neveketfelhasznalokat egy fileban tarolja, olyan strukturaban, mint az /etc/passwd
file UNIX rendszereken. Hozzadaskor a szukseges adatok: nev, lakas szama, melyik honap, egyenleg.
Modositani lehessen barmelyik adatot, es a lakas szam alapjan lehessen hivatkozni a bejegyzesekre. Torles hasonlokeppen.
Listanal irja ki a lakok adatait es, hogy az eddigi honapokban mennyi volt a kozos koltseg, befizettek-e, van-e tartozasuk.
"ujhonap" parancsnal lehet hozzadni minden lakonak az uj havi kozos koltseg osszeget.
28. APEH-szimulator
Keszits shell scriptet maganszemelyek adojanak kiszamitasahoz. Kerje be a rendszeres brutto havi jovedelmet, egyeb brutto
jovedelmet, es az esetleges osztondijat/szoctam-ot. Ezek alapjan szamitsa, ki, hogy mennyi jarulekot es adot kell fizetnie.
Az SZJA 18%, ha az eves brutto jovedelem 1.700.000 HUF felett van akkor 1.700.000-nek a 18% es a fele eso resz 36%-a az SZJA.
Az osztondij/szoctam/stb. adomentes, de az adoalapot noveli (gyk. az 1.700.000-be beleszamit). A munkavallaloi jarulek: 1.5%,
a magannyugdijpenztar: 8%, penzbeli eũ jarulek: 2%, egeszsegbiztositai jarulek: 4%, nyugdij jarulek: 1.5%. A maradek a netto.
Evi 1.400.000 HUF jovedelem alatt adojovairas veheto igenybe, ennek osszege havi (ezt kerje be szinten) max 9000 HUF,
tehat -9000 HUF/ho SZJA ha teljesul a feltetel.
Ugyanezt forditva is tudja, hogy netto jovedelmet adunk meg, es abbol kiszamolja mennyi a brutto (osztondijat nyilvan nem) es az egyeb jarulekokat/adokat.
Ezt a viselkedest a -n kapcsoloval lehessen elohozni.
© Fabók Zsolt, Viszlai Viktória, Vincze Dávid es masok.