Felhasználói eszközök

Eszközök a webhelyen


st-linux_alapok:fejezetek:shell-scriptek

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.

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"

< Vissza

st-linux_alapok/fejezetek/shell-scriptek.txt · Utolsó módosítás: 2016/05/05 11:18 szerkesztette: pferi