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.
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.
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.
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
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 !
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.
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
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
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"