Büki András
UNIX/Linux héjprogramozás
Büki András: UNIX/Linux héjprogramozás © Büki András
Felelõs kiadó a Kiskapu Kft. ügyvezetõ igazgatója © 2002 Kiskapu Kft. 1081 Budapest Népszínház u. 29. Tel: (+36-1) 303-9119, 477-0443 Fax: (+36-1) 303-1619 http://www.kiskapu.hu/ e-mail: kiskapu@kiskapu.hu Sorozatszerkesztõ: Szy György Lektor: Rézmûves László Mûszaki szerkesztõ: Csutak Hoffmann Levente ISBN: 963 9301 10 8 Készült a debreceni Kinizsi Nyomdában Felelõs vezetõ: Bördõs János
Tartalomjegyzék 1. fejezet Alapelemek Helló világ: elsõ héjprogramunk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Változók használata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Idézõjelek használata, parancsbehelyettesítés . . . . . . . . . . . . . . . . . . . . . . . . . 8 Parancssori paraméterek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 A szabványos be- és kimenet és ezek átirányítása . . . . . . . . . . . . . . . . . . . . . . 9 Csövek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 A csatornák számozása és a hibacsatorna átirányítása . . . . . . . . . . . . . . . . . . 13 Matematikai kifejezések kiértékelése : az expr parancs . . . . . . . . . . . . . . . . . 15 Parancsvégrehajtás : az eval parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 A beágyazott dokumentum (here document) . . . . . . . . . . . . . . . . . . . . . . . . . 18 2. fejezet Programvezérlési szerkezetek Feltételes utasítás : if, test, && és || . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Többszörös elágaztatás: a case szerkezet . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Ciklusszervezés : for, while és until . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Függvények . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3. fejezet Keresés, szûrés, szövegfeldolgozás, avagy a szabályos kifejezések lélektana Mire valók a szabályos kifejezések? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 A szabályos kifejezések alapelemei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 c (tetszõleges karakter) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 \c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 ^ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 $ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 [karakterek] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 [^...] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 [c1-c2] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Jelentésmódosító jelek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 + . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 (...) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 {x} vagy {x,} vagy {x,y} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 szabályos kifejezés 1. | szabályos kifejezés 2. . . . . . . . . . . . . . . . . . . . . . 46
vi
UNIX/Linux héjprogramozás
A szabályos kifejezések és a héj . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 A szabályos kifejezések és a mosógép . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Avagy hogyan írjunk szabályos kifejezéseket tartalmazó programot . . . . . 49 4. fejezet A sed használata héjprogramokban A sed mûködési elve . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 A sed alapvetõ parancsai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 p (Print) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 d (Delete) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 s (Substitute) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 a (Append), i (Insert) és c (Change) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 y (Transform) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 w (Write), r (Read) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 n (Next), q (Quit) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 Tizedespont, tizedesvesszõ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 Készítsünk telefonkönyvet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 5. fejezet Az AWK használata héjprogramokban Az awk mûködésének alapelvei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 A programok szerkezete és indítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Mezõk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Kiíratás (print) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Felhasználó által megadott változók . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 Kapcsolattartás a héjprogram és az awk program között . . . . . . . . . . . . . 80 Belsõ változók . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 A mezõelválasztó karakterek kezelése . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 Az AWK nyelvi elemei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 A BEGIN és END blokkok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 Matematikai mûveletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Feltételes utasítás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Beépített függvények . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Ciklusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Fájlok kezelése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Összetett gyakorlatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 Telefonkönyv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 Kettes számrendszer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Átlagolás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Névsor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Címlista és telefonkönyv összefésülése . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 Egy sor, több sor... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Tartalomjegyzék
6. fejezet A héjprogramok alapvetõ építõelemei A parancssori paraméterek és kapcsolók kezelése . . . . . . . . . . . . . . . . . . . . 101 Parancssori paraméterek hiányának felismerése . . . . . . . . . . . . . . . . . . . 101 Kapcsolók felismerése és fájl létezésének vizsgálata . . . . . . . . . . . . . . . . 102 Kapcsolók egybeírása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 A getopts parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Fájl típusának vizsgálata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 A szabványos bemenet olvasása: szûrõként mûködõ héjprogram . . . . . . . . 108 Írás a képernyõre, olvasás a billentyûzetrõl . . . . . . . . . . . . . . . . . . . . . . . . . 110 Várakozás billentyû leütésére . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 Átmeneti fájlok kezelése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 Jelek elfogása és kezelése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 Zárolás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 Idõzített végrehajtás, várakozás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 Önhívó parancsvégrehajtás teljes könyvtárszerkezetben . . . . . . . . . . . . . . . 125 Az xargs parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 7. fejezet Gyakorlatok I. Egyszerû feladatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 Változatok egy témára: az angol ábécé betûi . . . . . . . . . . . . . . . . . . . . . . . . 133 Feladat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 Elsõ megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 Második megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 Harmadik megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 Negyedik megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 A UNIX segédprogramok magyartudásának ellenõrzése . . . . . . . . . . . . . . 141 Feladat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 Tac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 Feladat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
vii
viii
UNIX/Linux héjprogramozás
Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 Rev . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 Feladat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 Titkosítás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 Feladat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 Betûk megszámlálása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Feladat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 Digitális számok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 Feladat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 Szavak keresése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 Feladat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 Számábrázolási pontosság . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 Feladat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 Csomagoljunk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 Feladat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 8. fejezet Gyakorlatok II. Segédprogramok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Igen vagy Nem? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Feladat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Egyszerû menürendszer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 Feladat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Tartalomjegyzék
A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 Interaktív parancsértelmezõ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 Feladat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 Számból szöveg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 Feladat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Telefonköltség kiszámítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 Feladat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 Felhasználók bejelentkezésének figyelése . . . . . . . . . . . . . . . . . . . . . . . . . . 187 Feladat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 Felhasználók lemezfoglalásának figyelése . . . . . . . . . . . . . . . . . . . . . . . . . . 190 Feladat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 Ötletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 A megoldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 9. fejezet Tippek, trükkök Kiegészítés Bash-felhasználóknak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 Változó nem meghatározottá tétele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 Parancsbehelyettesítések egymásba ágyazása . . . . . . . . . . . . . . . . . . . . . . . 203 A let parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 Közvetett változóhasználat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 Az üres parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 C stílusú megoldások . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 Gyermekhéj és névtelen függvény használata . . . . . . . . . . . . . . . . . . . . . . . 209 Tömbök használata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 Függelékek I. Függelék . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 II. Függelék . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 Tárgymutató . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
ix