=====Héjprogramok===== A héjprogramok (más néven shell szkriptek) szöveges állományok, amelyek végrehajtható parancsokat tartalmaznak. A héjprogram futtatásakor a egymás után ezek a parancsok végrehajtódnak. A shell szkripteknek nem kötelező kiterjesztést megadni. Ha mégis szeretnénk megadni akkor válasszuk az .sh kiterjesztést. A rendszer azonban nem a kiterjesztésből fogja eldönteni, hogy shell szkript vagy nem az. A szkriptek elsősorban a rendszer adminisztrációjának megkönnyítésére és szöveges adatok feldolgozására szolgálnak. Napjaink elterjedt GNU/Linux disztribúciói a parancssor, vagy a szkriptek ismerete nélkül is használhatók hétköznapi feladatokra. Fontos, hogy megértsük, hogy a bemutatásra kerülő szkriptek többségének (főleg a matematikai számításokat végzők) a gyakorlatban nincs létjogosultsága. Bemutatásuk azért fontos, hogy megismerkedjünk a környezettel, és később önállóan tudjunk olyan szkripteket írni, amik megkönnyítik munkánkat. ====Az első shell szkriptünk==== Hozzunk létre egy **elso.sc** nevű szöveges állományt a **proba** könyvtárban: palferi@lizi:~/proba$ touch elso.sc Adjunk futási jogot magunknak: palferi@lizi:~/proba$ chmod u+x elso.sc A fájl szerkesztéséhez valamilyen szövegszerkesztőre van szükség. GNU/Linux rendszereken biztosan megtaláljuk a karakteres felületű **vi** vagy **nano**, de használatuk kezdő felhasználónak nehézkes. Grafikus felületen a **gedit** programot használhatjuk. Amennyiben az **mc** program (Midnight Commander) telepítve van rendszerünkre, használhatjuk a beépített szerkesztőjét az adott fájlon az F4 billentyűvel. {{ :st-linux_alapok:mcedit.png?600 |}} Szerkesszük az **elso.sc** fájt, írjuk be az alábbi szöveget: #!/bin/bash echo "Helló Világ" Az első sor megadja a parancssori értelmezőt a **#!** karakterek után. Linux rendszeren többféle parancsértelmező elérhető. Közülük a leggyakrabban használt a **bash**, elérési útja: **/bin/bash**\\ A legtöbb Linux rendszeren, valamint a Mac OS X rendszereken a bash az alapértelmezett shell.\\ Az első sor kivételével minden **#** karakterrel kezdődő sort a szkript figyelmen kívül hagy, így ilyen sorokba írhatjuk megjegyzéseinket, magyarázatainkat. ====A shell szkript indítása==== Shell szkriptet abszolút vagy relatív elérési út és fájlnév megadásával indíthatjuk: palferi@lizi:~/proba$ /home/palferi/proba/elso.sc Helló Világ Csak a fájlnév beírva és Entert ütve hibaüzenetet kapunk: palferi@lizi:~/proba$ elso.sc elso.sc: a parancs nem található Ahhoz, hogy futtassuk meg kell adni, hogy az aktuális könyvtárban keresse a "./" karaktereket írva a fájlnév elé: palferi@lizi:~/proba$ ./elso.sc Helló Világ ====Változók és értékadás shell szkriptekben==== A változókat jellemzően nagybetűkkel jelöljük. Típusukat nem kell meghatározni. A változó tárolhat számot, karaktert és karakterekből álló sztringet. Az alábbi példában az **A** változónak a Hello értéket adjuk és a változó értékét **$A** kifejezés adja meg: #!/bin/bash A=Hello B="World !" echo "Változókkal: $A $B" Szóközt tartalmazó érték esetén idézőjeleket kell alkalmazni. Az echo parancsnál normál (kettős) idézőjelek használatakor változó behelyettesítésre kerül. Az idézőjelek közé írt szöveg megjelenik, a ''$A $B'' helyett pedig azok értékét látjuk a képernyőn: palferi@lizi:~/proba$ ./elso.sc Változókkal: Hello World ! ====Bevitel==== Bash szkriptben a **read** utasítással tudunk szöveget bekérni. Módosítsuk az elso.sc szkriptet a következőre: #!/bin/bash echo -n "Adja meg a nevét: " read NEV clear sleep 2 echo "Az Ön neve: $NEV" A szkript a echo paranccsal megjelenít szöveget, de a -n kapcsoló miatt nincs sortörés. A **read** parancs a **NEV** változóba bekér egy szöveget, majd a **clear** parancs törli a terminál tartalmát és 2 másodperc várakozás után (sleep 2) megjelenik a szöveg és változó értéke. ====Pozicionális paraméterek==== A pozicionális paraméterek azok az argumentumok, amelyeket végrehajtáskor átad a shell a meghívott shell szkriptnek. A paramétereket szóközzel elválasztva adhatjuk meg a szkript indításakor. A szkriptben az első paraméter értéke ''$1'', a másodiké ''$2'' és így tovább. Magának a shell szkriptnek a neve ''$0'', a paraméterek száma pedig ''$#''\\ Hozzuk létre a következő szkriptet ''parameterek.sc'' néven: #!/bin/bash # Példa szkript poziconális paraméterek gyakorlására echo "A shell szkript neve: $0" sleep 1 echo "A paraméterek darabszáma: $#" sleep 1 echo "Az első paraméter: $1" sleep 1 echo "A második: $2" sleep 1 echo "A harmadik: $3" Adjunk futási jogot és futtassuk a szkriptet az alábbi három paraméterrel: palferi@lizi:~/proba$ chmod u+x parameterek.sc palferi@lizi:~/proba$ ./parameterek.sc alma szilva 42 A shell szkript neve: ./parameterek.sc A paraméterek darabszáma: 3 Az első paraméter: alma A második: szilva A harmadik: 42 ====Idézőjelek használata==== Háromféle idézőjelet használhatunk a héj programokban: ^ Jelölés ^ Magyar név ^ Angol név ^ | " | idézőjel vagy macskaköröm | double quote | | ' | aposztróf | single quote vagy forward tick | | ` | fordított idézőjel | backtick | Ezek közül vizsgájuk meg először a harmadikat, a fordított idézőjelet. Adjuk ki a következő parancsot: palferi@lizi:~/proba$ echo `date` 2013. dec. 5., csütörtök, 00.16.03 CET Láthatjuk, hogy a fordított szimpla idézőjelek miatt a **date** parancs végrehajtódott és annak az eredményét jeleníti meg az echo parancs. Ezt parancs behelyettesítésnek is nevezik. Az idézőjelek helyett használhatjuk a következő alakot is: palferi@lizi:~/proba$ echo $(date) 2013. dec. 5., csütörtök, 00.20.18 CET Az aposztróf megakadályozza a behelyettesítést, minden egyes karakter saját magát jelenti. Így az alábbi kiíráskor: palferi@lizi:~/proba$ echo 'ez itt $B' ez itt $B nem a B változó értékét írtuk ki, hanem a ''$B'' karaktereket. A shell nem ír át semmit a sztring belsejében, úgy dolgozik vele ahogy leírtuk.\\ Ezzel szembe a macskaköröm használata esetén: palferi@lizi:~/proba$ B=42 palferi@lizi:~/proba$ echo "ez itt $B" ez itt 42 A B változó értékét jeleníti meg. Ezt paraméter kifejtésének nevezzük. Ezen kívül még parancs behelyettesítés is működik a macskakörömmel határolt kifejezésben: palferi@lizi:~/proba$ echo "Dátum és idő: `date`" Dátum és idő: 2013. dec. 5., csütörtök, 23.11.15 CET ====Számtani alapműveletek shell szkriptekben==== A shell közvetlenül nem támogatja az elemi aritmetikát. A műveletek végrehajtásához ez **expr** utasítást kell alkalmaznunk, jellemzően az előbb bemutatott parancs behelyettesítéssel. Példa: ''C=`expr 4 + 5`''\\ Az alábbi ''szamol.sc'' nevű szkriptben végezzük el az alapműveleteket a paraméterében megadott két egész számmal: #!/bin/bash # kiszamoljuk S=`expr $1 + $2` K=`expr $1 - $2` SR=`expr $1 '*' $2` H=`expr $1 '/' $2` M=`expr $1 '%' $2` # az echo paranccsal kiiratjuk echo "$1 + $2 = $S" echo "$1 - $2 = $K" echo "$1 * $2 = $SR" echo "$1 / $2 = $H" echo "maradék $M" Figyeljük meg, hogy az aposztrófokat használunk szorzásnál, osztásnál és maradékszámításnál, mert ezek speciális karakterei a shellnek. Futtassuk a szkriptet: palferi@lizi:~/proba$ ./szamol.sc 14 3 14 + 3 = 17 14 - 3 = 11 14 * 3 = 42 14 / 3 = 4 maradék 2 Látható, hogy az expr csak egész számokkal dolgozik, matematikai feladatokhoz a későbbiekben bemutatásra kerülő **bc** programot fogjuk használni.\\ Az **expr** helyett használhatunk két zárójellel határolt aritmetikai kiértékelést is, a kezdő zárójelek elé ''$'' jelet írva. Ezt alkalmazva programunk a következőképpen módosul: #!/bin/bash # kiszamoljuk S=$(($1+$2)) K=$(($1-$2)) SR=$(($1*$2)) H=$(($1/$2)) M=$(($1%$2)) # az echo paranccsal kiiratjuk echo "$1 + $2 = $S" echo "$1 - $2 = $K" echo "$1 * $2 = $SR" echo "$1 / $2 = $H" echo "maradék $M" [[st-linux_alapok:st-linux_alapok|< Vissza]]