Készítette: Petróczy Tibor Rendszerprogramozás Linux környezetben 1 1. Unix shellek és shell scriptek Miért, és mikor: - használtál már UNIX/Linux rendszert - ismered a rendszer alapfilozófiáját - nem a GUI felület az elsődleges - hatékony és gazdaságos üzemeltetés Rendszerprogramozás Linux környezetben A shell tulajdonságai: - parancsértelmező és programozási nyelv - a at a standard inputról vagy állományból olvassa - shell script segítségével egyszerűen bővíthető a parancskészlet - paraméterezhető (kapcsolók) - string változókra és vezérlési szerkezetekre épül - egyszerű átirányítás (>, <) - csővezeték használata - beépített használhatósága Shell részletesebb ismertetése a Linux alapismeretek alatt. Shellek beállítása alapvetően az /etc/profile fájl alatt érhető el. (~/.profile, ~/.bach_profile ) Shell script futtatása: - shell-en keresztül -> /bin/sh fájlnév - futtathatóvá kell tenni -> chmod 700 fájlnév, majd./fájlnév - sticky bit használata (más jogosultságával való futtatás) - kezdő sor a shell elérési utja: #!/bin/sh Futtatáskor alapvetően 2 hiba fordulhat elő, az egyik, hogy maga a script állomány nincs futtatható állapotra állítva, a másik pedig, hogy olyan helyről szeretnénk futtatni az állomány, amely nincs benne a PATH-ban. Parancsok: - Ctrl-C: program futásának megszakítása - Ctrl-D: programból való kilépés (exit) - Ctrl-Z: program futásának felfüggesztése (jobs, fg %n)
2 2. Shell alapelemek Fontosabb környezeti változók: - $HOME: login katalógus neve - $PATH: keresési út a programok végrehajtásához - $MAIL: elérési út ahova a mailjeink érkeznek - $PS1: elsődleges prompt - $PS2: másodlagos prompt - $EDITOR: alapértelmezett szövegszerkesztő - $PWD: aktuális munkakönyvtár - $OSTYPE: operációs rendszer típusa - $SHELL: jelenleg futó shell típusa - $TERM: terminál típusa - $RANDOM: véletlen szám - $USER: aktuális felhasználói név Változók használata: - valtozo=ertek - valtozo1=45 - valtozo2= Test szoveg - értékadásnál nincs szóköz az egyenlőség bal és jobb oldalán! - minden változót szövegként kezel - a szöveget jelek közé kell tenni - változó kiíratása a $-jel használatával: echo $valtozo1 - : betű szerinti kiíratás, ekkor nincs értelmezés, pl: echo Valtozo: $valtozo1 - : shell számára értelmes karaktereket értelmezi és behelyettesíti, pl: echo Valtozo: $valtozo1 - ` ` : parancsvégrehajtás, behelyettesítés Shell belső változói: - $# (parancssori paraméterek száma) - $n (n-edik parancssori paraméter értéke, max. 9) - $0 (aktuális héjprogram neve) - $$ (futó program azonosítója) - $? (exit státusz) - $- (a héjprogramot végrehajtó héjnak átadott kapcsolók) - $* (az összes paraméter egyben egyetlen stringként) Matematikai kifejezések: - < -lt (kisebb - less) - <= -le (kisebb egyenlő less equal) - = -eq (egyenlő - equal) - == -eq (Egyenlő - equal) -!= -ne (nem egyenlő not equal) - >= -ge (nagyobb egyenlő greater equal )
- > -gt (nagyobb - greater) - +, -, *, /, % (a szorzás védőkarakterrel értelmezendő: \* ) - -a logikai és ( ) - -o logikai vagy ( & ) -! logikai tagadás - expr(művelet) : végrehajtás 3
4 3. Átirányítások Parancs és adatfeldolgozás: 1. Szabványos bemenetre érkező adatokat fogadja (billentyűzet, file, másik program kimenete, hardver eszköz) 2. Feldolgozás 3.a Szabványos kimenetre küldi (képernyő, file, másik program bemenete, hardver eszköz) 3.b Szabványos hibacsatorna (Hiba csatorna + egyéb információk) -> fájlba, képernyőre Típusok: - program > file (program kimenete fájlba, ha létezik felülírja, ha nem létrehozza) - program >> file (program kimenete fájlba hozzáfűzéssel ha létezik, ha nem létrehozza) - program < file (program bemenete fájlból) - program 1 program 2 (első program kimenete a másik program bemenete) pl: program > /dev/audio, program > /dev/printer, program > /dev/null Szűrők: tipikusan a stdin-ról olvasnak és a stdout-ra írnak. Egyszerűen csővezetékbe szervezhetőek. Elágaztatás: tee parancs Elágazás segítségével egyidejüleg megkapjuk a képernyőn a végeredményt + fájlba írjuk a szükséges információkat. pl: ps aux sort tee filenev Leggyakoribb szűrők: - cat fájlok összemásolása - more fájlok kiírásának tördelése - less fájlok kiírásának tördelése - head fájl első n sora - tail fájl utolsó n sora - tee adatfolyam elágaztatás - sort sorbarendezése - tr karakterhelyettesítő - wc sor és karakterszámláló - diff fájl összehasonlítása - sed adatfolyam editor - uniq előfordulás vizsgálat
5 4. Vezérlési szerkezetek A. Feltételkezelés (if) if [logikai feltétel] then elif [logikai feltétel] then else fi A feltétel kezelés során használhatjuk a test parancsot, vagy a * + zárójel part. A test parancs segítségével kifejezések kiértékelése: Fájlokra alkalmazva: Szintaktika: test [kapcsoló] [file] Kapcsolók r Értéke igaz, ha a fájl létezik és olvasható -w írható -x futtatható f Értéke igaz, ha a fájl létezik s Értéke igaz, ha a fájl létezik és hossza nem nulla -b blokkos eszköz -c karakteres eszköz -d könyvtár -l közvetett hivatkozás -p csővezeték -e létezik -G saját csoportba tartozik -O saját tulajdonba tartozik file1 nt file2 a file1 újabb, mint a file2 file1 ot file2 a file1 régebbi, mint a file2 file1 ef file2 afile1 és file2 azonos állományt jelöl Karakterlánc kapcsolók: test $str1=$str2 Értéke igaz, ha a 2 változó értéke megegyezik test $str1!= $str2 Értéke igaz, ha a 2 string nem egyenlők test z $str Értéke igaz, ha a változó hossza nulla test n $str Értéke igaz, ha a változó hossza nem nulla Számokra értelmezve: Használjuk az aritmetikai összehasonlító kifejezéseket
6 B. Ciklusok (for) A shell programozás alapvető for ciklus kezelése: for változó in lista do done Bash script esetében használható a feltételes for ciklus kezelés: for (( kezdőérték; feltétel; léptetés )) do done C. Ciklusok (while) A ciklus addig fut, ameddig a logikai kifejezés értéke igaz! while [ logikai kifejezés ] do done Figyeljük a cikluson belüli változó növelésére a feltétel függvényében, hogy ne kapjunk végtelen ciklust, lehetséges megoldások: valtozo=`expr $valtozo + 1` valtozo=$((valtozo+1)) true $((valtozo++)) D. Ciklusok (until) A ciklus addig fut, ameddig a logikai kifejezés értéke hamis! until [ logikai kifejezés ] do done E. Többágú szelekció (case) case valtozo in minta1) parancs;; minta2) parancs;; *) parancs;; esac
7 5. Függvények - Függvény változói nem lokálisak, hozzáférnek a főprogram változóihoz és maguk is létrehozhatnak újakat, ezeket a főprogram is örökölni, illetve látni fogja. - Többszörös meghívás esetén nem lesznek többször létrehozva, csak a függvény első meghívásakor - önálló be- és kimenettel, visszatérési értékkel, valamint saját parancssori paraméterekkel rendelkeznek - visszatérésük értékét müködésük végén adják át fuggveny () { } fuggveny Függvény hívásának blokkját meg kell előzni a megírt (létező) függvény törzsének. A meghíváskor tetszőlegesen elláthatjuk a függvényünket paraméterekkel, amelyekre hivatkozhatunk a függvény törzésben. Példa: fuggveny_paramter () { } echo Kiirjuk a 2. paramétert: $2 fuggveny_paramter Elsö Második Harmadik 5 Tiz Jelen példában, a függvényünket 5 tetszőleges paraméterrel hívtam meg, és a függvény törzsében hivatkoztam a második meghívott paraméterre, így a képernyőre a következő sort írja ki: Kiirjuk a 2. paramétert Második
8 6. Reguláris kifejezések A reguláris kifejezések a UNIX/Linux rendszerek mélyebb megismerésénél nélkülözhetetlenek, elsősorban felhasználási területük: - keresések - szűrések - cserék A szabályos, vagy reguláris kifejezésekkel vezérlhetjük a programokat. Leggyakabban használt eszközök: grep, sed, awk A grep a bemenetre érkező sorok közül csak azokat küldi a kimenetre, amelyek megfelelnek az adott reguláris kifejezésnek (szűrési feltételnek). A sed (Strem Editor) a megadott szerint módosítani is tudja a kimenetet (csere). Sor alapú, de a teljes bemenetet egyben is kezelheti. Az awk programozási nyelv szövegfeldolgozásra. Soronként kezeli a bemenetet, és a kimenetet módosítani tudja, továbbá a sorokon belül mezőket is megkülönböztet (pozícionálás). Használt speciális karakterek: ^ sor eleje (grep ^a file : a betűvel kezdődő fájlok) $ sor vége (grep a$ file : a betűre végző fájlok). tetszőleges karakter (kivéve új sor) \ mentesítő karakter, speciális jelentés ki/be kapcsolás [ lista ] egyetlen karakter, amely a megadott lista bármely eleme lehet [^lista] egyetlen karakter, amely a listában felsoroltakon kivül bármi lehet [a-z] [A-Z] bármilyen kisbetű bármilyen nagybetű [0-9] bármilyen számjegy * ismétlő karakter, a * előtt álló karakter vagy kifejezés tetszőleges (akár 0) számú előfordulása + ismétlő karakterek, de megköveteli, hogy az előtte lévő karakter, vagy kifejezés legalább egyszer előforduljon ( ) csoportba rendezi a szabványos kifejezéseket, egységként kezeli logikai VAGY { } illeszkedések száma (,x- pontosan,,x,- legalább, {x,y} intervallum) Példák: cat szoveg grep ^[0-9] cat szoveg grep ^[0-9]\{1\}[^0-9] cat szoveg grep ^[0-9]\{1\}[^0-9]* - számmal kezdődik - 1db számmal kezdődik és követi valami kötelezően - 1db számmal kezdődik, de lehet 1db szám is
9 7. Stream editor SED: folyamat editor, vagy programozható szövegszerkesztő A szabványos bemenetre érkező szöveget képes feldolgozni és átalakítani. Hogyan: a feldolgozandó szöveget soronként egy átmeneti tárba, az úgynevezett mintatérbe olvassa be, szabályos kifejezések alapján megkeres benne bizonyos részeket, majd elvégzi rajtuk az egybetűs formájában megadott műveleteket. pl: sed program vagy sed program filenév Jelen példában a program a sed saját nyelvén írt szöveg feldolgozási utasítássorozatot jelenti. Általános program: <cím1>, <cím2> parancs A cím jelen esetben, lehet: - szám: a bemenet adott sorszámú sorra pl: sed 10 parancs - csak a 10. soron hajtódik végre sed 1, 10 parancs - az 1-től 10-ig terjedő sorokra hajtódik végre sed parancs 10 - a keresett mintának csak a 10. előfordulásán hajtódik végre - szabványos kifejezés pl: sed /[0-9]/ parancs - csak a számokat tartalmazó sorokon érvényesül sed /[a-z]/ parancs - csak a kisbetűket tartalmazó sorokon érvényesül Alapvető parancslista: - p: kiíratás - d: törlés - s: helyettesítés egy előfordulásnál - s-g: helyettesítés minden előfordulásnál - a: hozzáfűzés - i: beszúrás - c: a mintatér cseréje - y: a karakterek cseréje - n: még 1 sort olvas a bemenetről és hozzáfűzi a mintatérhez Példák: cat szoveg sed p - duplan jeleníti meg a sorokat cat szoveg sed 10 p - duplán jeleníti meg a 10. sort cat szoveg sed 1, 10 p - duplán jeleníti meg 1-10-ig a sorokat -n - letilthatjuk az alapértelmezett megjelenítést cat szoveg sed n 10 p - csak a 10. sort jeleníti meg cat szoveg sed 1, 10 d - törli 1-10-ig a sorokat cat szoveg sed s/mit/mire/ - csak az első előfordulást cseréljük cat szoveg sed s/mit/mire/g - minden előfordulást cserélünk cat szoveg sed y/mit/mire/ - helyettesítendő/helyettesítő karakterszámra egyforma!
Fájlba íratás: sed program f fájlnév 10
11 8. AWK programnyelv Jellemzői: - Szövegfeldolgozásra szakosodott programnyelv, több változata létezik: - awk, gawk (GNU projtect), tawk (MS-Windows DLL), awka, mksawk, awkcc, mawk - a C szövegszerkesztésre kihegyezett változata, képességei azonosak egy grafikus felületen futó táblázatkezelővel - az awk alapvető feladata, hogy olyan szövegegységeket keressen file-okban, amelyek tartalmaznak egy bizonyos mintát - a minta lehet szabványos kifejezés vagy logikai feltétel, ha nincs minta akkor minden sorra végrehajtja - az awk programok adatvezéreltek (először az adatot adjuk meg amivel dolgozni szeretnénk, aztán azt, hogy mit szeretnénk csinálni) Futtatása: - szabványos bementről: awk {} - feldolgozandó fájl megadásával: awk {} file1 <file2> - ha a program hosszabb, vagy külön fájlban van: awk f programfile awk f programfile file1 <file2> Feldolgozás: programfile.awk #!/bin/awk - soronként történik, a sorokat mezőkre osztja (legkisebb feldolgozási egység) - a mezőket a mezőelválasztó karakterrel tagoljuk, értéke definiálható [-F] (alapértelmezetten: szóköz, tabulátor) - mezőkre hivatkozás: $1, $2, $n, a $0 az egész sort jelöli - a minták megadása reguláris kifejezéssel / / jelek között - logikai feltételek a C-ben megszokott operátorokkal: a>2 Változók: - felhasználó által megadott változók: a. nem kell külön deklarálni, első értékadáskor létrejönnek b. megadhatjuk program futása előtt is, vagy a héjprogram változóját is átvehetjük pl: less /etc/passwd awk F: {nev= Felhasznaloi nev: ; konyvt= Konyvtar: ; print nev,$1 konyvt$6}
12 c. BEGIN blokk használata, ez a főciklustól független műveletek végrehajtását teszi lehetővé, így a BEGIN még a sorok feldolgozása előtt, de csak egyszer fog végrehajtódni, míg az END blokk a sorok feldolgozás után végez el valamilyen műveletet pl: awk F: BEGIN {nev= Felhasznaloi nev: ; konyvt= Konyvtar: } {print nev, $1, konyvt$6} - belső változók: a. FILENAME (aktuális bemeneti fájl) b. FS (bemeneti mezőelválasztó karakter) c. NF (az aktuális sor mezőinek száma) d. NR (az aktuális sor száma) e. OFS (kimeneti mezőelválasztó karakter) Operátorok: - = (értékadás) - (vagy) - && (és) -! (tagadás) - relációs operátorok (>=, ==,!= ) - aritmetikai operátorok (+, -, *, /, %, ++, --) Vezérlési szerkezetek: - ugyanaz, mint a C programozási nyelv esetében if (feltétel) utasítás else utasítás for(kifejezés1;feltétel;kifejezés2) utasítás for(változó in tömb) utasítás while(feltétel) utasítás break continue next exit Beépített függvények: (eltérhetnek a különböző awk-k esetében) - cos(kif): kifejezés koszinusza - exp(kif): kifejezés exponenciális függvénye - getline(): következő sor beolvasása, ha a visszatérési értéke 0, akkor fájl vége - index(s1,s2): s2 kezdő pozíciója s1-ben - int(kif): kifejezés egészrésze - length(s): s string hossza - log(kif): kifejezés logaritmusa - sin(kif): kifejezés szinusza - split(s,a,d): s-t d elválasztójel szerint a[1] a[n] tömbelemekre osztja, visszatérési értéke n
- sprintf(fmt, ): a -ot fmt formátum string szerint formázva adja vissza - substr(s,m,n): s string m-edik karaktertől kezdődő n karakteres része 13