=====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]]