Shell scripting (bash)
A shell script egy szöveges fájl, amely shell parancsok listáját tartalmazza, és programként hajtódik végre egy feladat vagy feladatok egy csoportjának végrehajtása érdekében. A shell script elsődleges célja a feladatok automatizálása és az időmegtakarítás. Fontos megérteni egy héjszkript alapvető felépítését, mivel egy számítástechnikai klaszterrel héjszkripteken keresztül lépünk kapcsolatba (lásd a következő fejezetet a Grid Engine-ről)
Mi az a Bash?
A Unix-szerű rendszerekben sokféle héj áll rendelkezésre. A Bourne Again Shell (Bash) ezek egyike, ez az alapértelmezett shell a GNU/Linux rendszereken. Van néhány előnye a többi shellhez képest, és nagyjából a standard shell, és az alábbiakban megmutatjuk, hogyan használhatjuk szkriptírásra.
Egy egyszerű bash shell szkript írása
Az alapvető shell szkript nem más, mint parancsok sorozata. Ezt mutatjuk be a következőkben.
Írjunk egy egyszerű szkriptet, amely a echo
parancs segítségével kiadja a képernyőre a “hello world” szót. A szövegfájlt elmentjük myScript.sh
#!/bin/bash echo Hello World
Egy héjszkript szintaxisának végrehajtása:bash your-script-name
. A mi esetünkben azt írjuk:
$ bash myScript.sh Hello World
bonyolultabb példa
Írjunk egy kicsit bonyolultabb szkriptet, amiben több shell parancsot használunk. A szkript a ls
parancsot használja a fájlok listázására, és a wc -l
parancsot, amely megszámolja az adott fájl vagy szabványos bemenet sorainak számát. Ebben az esetben a wc -l
a ls -l
kimenetében lévő sorok számát számolja. Mindezt a pipe |
használatával érjük el.
a script.sh tartalma:
#!/bin/bash echo here are the list of files ls -l echo The number of files: ls -l | wc -l
A következőképpen tudjuk végrehajtani:
$ bash script.sh
változók a bash szkriptekben
A bash szkriptekben is használhatunk változókat. Amelyek hasznosak a köztes parancsok kimenetének rögzítésére és más parancsok futtatására használhatók.a változóknak nincsenek adattípusai. Egy változó a bashben a következők bármelyikét tartalmazhatja: szám, karakter vagy karakterlánc.
Nem kell deklarálni egy változót, elég, ha a hivatkozásához értéket rendelünk, és máris létrejön.
Most létrehozunk egy egyszerű szkriptet egy változóval. Ehhez a változóhoz Hello world
stringet rendelünk, és a változót echo
-vel kiírjuk.
#!/bin/bash VAR="Hello world" echo $VAR
A változó hozzárendelésekor nem használtuk a $
jelet, de a változó használatakor a $
jelet kellett használnunk.
parancssori argumentumok a bash szkriptekben
A szkript is fogadhat parancssori argumentumokat. Itt módosítjuk a szkriptet, amely felsorolja a fájlt, hogy elfogadjon egy parancssori argumentumot. Az argumentum egy könyvtár elérési útvonala lesz.
a script2 tartalma.sh:
#!/bin/bash VAR= echo here are the list of files ls -l $VAR echo The number of files: ls -l $VAR | wc -l
Íme a szkript futtatása:
$ bash script2.sh /home/user/project
Az argumentumokat változókban tároljuk, az argumentum sorrendjének megfelelő számmal, az 1-től kezdve
- Első argumentum:
- Második argumentum: $2
- és így tovább…
A mi esetünkben megfelel
/home/user/project
-nek.
Aritmetikai műveletek bash szkriptek
Az egész számokkal végzett aritmetikai műveletek a bashben a következő formátumban történnek:
#!/bin/bash x=6 y=2 $((10 - 5)) $((x-y)) echo $((x-y)) echo $((10-5))
Ezeket a parancsokat másolva beillesztheted a konzolra is, hogy lásd, hogyan működnek. A echo
parancsoknak 4
és 5
értékeket kell kiadniuk.
A bash aritmetika nem támogatja a lebegőpontokat (pl. az 1.3 -1 művelet nem fog működni a bash-ben), a bc
parancsot kell használnod. Lásd ezt a stackOverflow példát a bc
használatára.
Looping over files
Ha egy feladatot próbál automatizálni a bash szkriptelés segítségével, akkor nagy valószínűséggel bizonyos parancsokat kell alkalmaznia egy könyvtár minden egyes fájljára. Ezt vad karakteres*
és for
ciklusokkal lehet elérni. A következő szkript a /path/to
könyvtárban található összes ‘.txt’ fájlt a FILES
változóban tárolja. Ezután minden egyes fájlhoz kiszámítja a sorok számát, és ezt adja ki a wc -l
paranccsal.
#!/bin/bash FILES=/path/to/*.txt for f in $FILES do echo "Processing $f file..." # count number of lines and output that for file $f wc -l $f done
Tovább a bash szkriptekről
A vezérlési struktúrák (if/else, for/while ciklusok) használatával még bonyolultabb shell szkripteket is írhatunk, és sok mindent elérhetünk csak a shell szkriptek használatával, de ez meghaladja a dokumentum kereteit. Tekintse meg az alábbi linkeket, ha jobbá akar válni a shell-szkriptek írásában.
- http://www.freeos.com/guides/lsst/
- http://www.tldp.org/LDP/Bash-Beginners-Guide/html/