Ez a bemutató azt tárgyalja, hogyan írhatsz könnyen saját Bash szkripteket Linuxon.
Rendszergazdaként nagy valószínűséggel olyan ismétlődő feladatokat végzel, amelyeket automatizálni lehetne.
Az Ön szerencséjére létezik egy olyan programozási nyelv, amelyet Linuxon szkriptek írására használhat : a Bash programozási nyelv.
A Bash használatával a Bash szkriptekben tetszőleges számú parancs megadásával teljes rendszermentéseket ütemezhet.
Egyéni szkripteket is készíthet, amelyek létrehozzák és törlik a felhasználókat és eltávolítják a hozzájuk tartozó fájlokat.
A Bash segítségével szkripteket is futtathat, és hasznos teljesítményméréseket tölthet ki egy fájlba vagy adatbázisba.
A Bash egy nagyon hatékony programozási nyelv a rendszergazdák számára.
A mai bemutatóban megtanuljuk az összes alapot, amit a Bash-ről tudni kell : hogyan hozzon létre és futtasson szkripteket, hogyan használja hatékonyan a változókat és a shell beépített moduljait.
Tartalomjegyzék
- Mit fogsz tanulni
- Kezdjük el a Bash használatát
- A Bash története
- Bash programozási nyelv
- Bash szkriptek létrehozása és futtatása
- Specifying shell using shebang
- Bash szkriptek futtatása
- A shell-értelmező megadása
- A szkript elérési útvonalának megadása
- A szkript hozzáadása a PATH-hoz
- Shell built-ins explained
- Bash-változók használata
- Parancsok végrehajtása szkripteken belül
- A kilépési állapotok megértése
- Feltételek kezelése a Bashben
- Gyakorlati eset : annak ellenőrzése, hogy a felhasználó root-e
- Következtetés
Mit fogsz tanulni
Ha végigolvasod ezt a bemutatót, a következő fogalmakat fogod megismerni a Bash-sel kapcsolatban
- Hogyan hozzunk létre és futtassunk Bash szkripteket a parancssor segítségével;
- Mi a shebang és hogyan használja a Linux a szkriptíráshoz;
- Mi a shell built-ins és miben különböznek a hagyományos rendszerprogramoktól;
- Hogyan használjuk a Bash változókat és mik a speciális változók;
- Hogyan használjuk a Bash parancsok helyettesítését;
- Hogyan használjunk egyszerű IF utasításokat a Bash-en;
Amint láthatjuk, ez egy elég hosszú program, ezért minden további nélkül kezdjük azzal, hogy megnézzük, hogyan tudunk Bash szkripteket létrehozni és futtatni.
Kezdjük el a Bash használatát
A parancsok kiadása előtt ejtsünk néhány szót a Bash és a Shell közös történetéről.
A Bash története
A Bash shell első verzióját 1989-ben adta ki Brian Fox, és a Unix shell nyílt forráskódú implementációjaként érkezik.
Akkoriban, amikor a Unix-rendszerek kezdtek kialakulni, az ilyen rendszerek Bourne-héjnak nevezett szabványos Unix-héjakat használtak.
A Unix korai időszakában az olyan vállalatok, mint az MIT vagy a Bell Labs által fejlesztett rendszerek nem voltak szabadok és nem voltak nyílt forráskódúak.
Még ha dokumentációt is biztosítottak ezekhez az eszközökhöz, a GNU kezdeményezés (Richard Stallman vezetésével) számára prioritássá vált, hogy a Unix Shellnek saját verziója legyen.
A GNU projekt bejelentése után hat évvel megszületett a Bash (Bourne-Again Shell) shell, amely még az eredeti Bourne shellnél is több funkcióval rendelkezik.
Bash programozási nyelv
Mikor egy Unix-szerű rendszerrel, például a Linuxszal dolgozunk, a Bash általában két jelentéssel bír :
- A Bash egy parancssor-értelmező vagy más szóval egy Unix shell. Ez azt jelenti, hogy valahányszor megnyitunk egy terminált, egy Unix-héjjal állunk szemben, ami legtöbbször egy Bash-héj.
A parancsok közvetlen beírásakor a terminálba a parancsokat a héj értelmezi, a rendszerhívások segítségével végrehajtja, és a visszatérési értékeket visszaadja a végfelhasználónak.
Ha nem vagyunk biztosak abban, hogy éppen milyen interpreterrel dolgozunk, a SHELL környezeti változó jelzi, hogy éppen melyik shell-t használjuk.
$ printenv SHELL
Mint látható, ebben az esetben helyesen a Bash parancsértelmezőt használjuk munkánkhoz.
Fontos megjegyezni, hogy még ha az olyan kifejezéseket, mint a “Bash scripting” és a “Shell scripting” felcserélhetően használják is, a disztribúciótól függően előfordulhat, hogy valójában nem ugyanazt a dolgot írják le.
Néhány újabb disztribúció (például a Debian 10) szimbolikus linkekkel rendelkezik az eredeti Bourne shellből (sh néven) a saját shell implementációjukra (ebben az esetben Dash vagy Debian Almquist shell)
- A Bash szintén egy parancssori nyelvet ír le, és Bash nyelvnek is nevezik. A Bash olyan operátorok és operandusok készletét tárja fel, amelyeket néhány alapvető funkció, például a piping vagy több parancs egyszerre történő végrehajtása érdekében használhatunk.
Az alapvető csővezetés végrehajtásakor a “|” szimbólummal szoktunk dolgozni. Ez a szimbólum a Bash parancssori nyelv része.
Ugyanez a logika érvényes a “&&” szimbólumra is, amely akkor és csak akkor hajtja végre a második parancsot, ha az első parancs sikeres volt.
$ command1 && command2
Bash szkriptek létrehozása és futtatása
Most, hogy némi háttérismerettel rendelkezünk a Bash héjról és a Bash parancssori nyelvről, kezdjük el egyszerű Bash szkriptek létrehozásával és futtatásával.
Az első Bash szkript létrehozásához egyszerűen hozzon létre egy “script.sh” nevű fájlt.
Amint valószínűleg már észrevette, még mindig a “sh” kiterjesztést használjuk, amely az eredeti Bourne héjra utal (szintén sh-ként jelölve).
$ touch script.sh
Most egy “sh” kiterjesztéssel végződő fájl létrehozása még nem elég ahhoz, hogy a szkriptünket Shell-szkriptnek tekintsük.
A fájl parancs futtatásával tulajdonképpen láthatjuk, hogy a fájlunk még nem tekinthető shell-szkriptnek.
$ file script.sh
Amint itt is láthatjuk, a fájlunk csak egy egyszerű üres fájlt ír le.
Hogy a fájlodat shell script fájlként írják le, meg kell adnod a shebang sort a fájlod elején.
Specifying shell using shebang
Ha már jó ideje használod a Linuxot, nagyon valószínű, hogy már találkoztál a shebang sorral a fájlod elején.
A shebang, a “Hash + “Bang” rövidítése, egy egysoros sor, amelyet a shell szkriptek elejére tesznek annak megadására, hogy milyen shell-t használjunk az adott szkript értelmezésére.
#!/bin/<shell>
Esetünkben Bash szkriptekkel szeretnénk dolgozni. Más szóval azt akarjuk, hogy a szkriptjeinket egy Bash-értelmező értelmezze.
Az értelmező elérési útvonalának meghatározásához használhatjuk a “which” parancsot.
$ which bash/bin/bash
Most, hogy tudjuk az értelmező elérési útvonalát, szerkesszük meg a szkriptfájlt, és adjuk hozzá a shebang sort a fájl elejére.
#!/bin/bash
Most, hogy hozzáadtad ezt a sort a fájlod elejére, futtasd újra a “file” parancsot, hogy lásd a különbséget.
Mint látod, a kimenet kissé más : ezúttal a szkripted “Bourne-Again shell script”-ként, és ami még fontosabb, futtatható fájlként jelenik meg.
Mi történne, ha nem adnád meg a shebang sort a szkript elején.
Ha nem adod meg a shebang sort, akkor a szkript az aktuális shell segítségével fut le, amit az execute parancs indításához használtál.
Most, hogy már tudod, hogyan kell Bash szkripteket létrehozni, nézzük, hogyan tudod őket végrehajtani.
Bash szkriptek futtatása
A Bash szkriptek Linuxon történő futtatásához alapvetően két lehetőségünk van :
- A használni kívánt shell-értelmező és a szkriptfájl megadásával;
- A szkriptfájl elérési útvonalának használatával
A shell-értelmező megadása
Az első módszer meglehetősen egyszerű.
A bash szkript futtatásához maga adja meg a használni kívánt interpreterét.
$ bash <script>$ /bin/bash <script>
A korábban használt példát használva a következő kimenetet kapnánk.
Mint láthatjuk, ehhez a módszerhez még a fájl execute jogosultságaira sincs szükség, csak a bash futtatót kell tudni használni.
Amint láthatod, más felhasználóként bejelentkezve, execute engedélyek nélkül is képes vagyok végrehajtani ezt a szkriptet.
Ez azért fontos megjegyzés, mert előfordulhat, hogy a szkriptfájljaidat védett könyvtárakban akarod tárolni (amelyekhez csak te férsz hozzá), hogy más felhasználók ne tudják végrehajtani a fájljaidat.
A szkript elérési útvonalának megadása
A bash szkriptek futtatásának másik módja a fájl elérési útvonalának megadása.
Ez a módszer használatához a fájlnak execute engedélyekkel kell rendelkeznie.
Először is használjuk a “chmod” parancsot az aktuális felhasználó execute engedélyeinek beállításához.
$ chmod u+x <script>
Mint láthatod, a fájl színe egészen más : az aktuális terminálod a futtatható fájlokat meghatározott színekkel emeli ki, ebben az esetben a zöld színnel.
Most, hogy a szkripted futtatható, a szkript relatív vagy abszolút elérési útjának megadásával végre tudod hajtani.
A jelenlegi munkakönyvtáramban található “script.sh” nevű fájlt használva a szkript a
$ ./script.sh
Ha más könyvtárban vagyunk, akkor a szkriptfájl abszolút elérési útját kell megadnunk.
$ /home/user/script.sh
Amint mostanra már valószínűleg rájöttél, ez a módszer nem túl kényelmes, ha minden egyes alkalommal meg kell adnod a szkript elérési útvonalát.
Szerencsédre van egy mód arra, hogy a parancssorba egyszerűen a fájlnevet beírva futtasd a szkriptet.
A szkript hozzáadása a PATH-hoz
A “.sh” kiterjesztés nem szükséges ahhoz, hogy egy szkriptet szkriptfájlnak tekintsünk.
Az egyszerűség kedvéért átnevezzük a meglévő “script.sh” fájlt “script”-re.
Fájlok átnevezéséhez Linuxon egyszerűen használjuk az “mv” parancsot, és adjuk meg a forrás- és a célcélt.
$ mv script.sh script
Most, mi van, ha a “script” beírásával szeretnénk végrehajtani a szkriptünket?
Ezhez hozzá kell adnod a szkripted elérési útvonalát a PATH környezeti változóhoz.
A PATH környezeti változó aktuális értékének kiírásához használd a “printenv” parancsot a “PATH” argumentummal.
$ printenv PATH
Az aktuális munkakörnyezetedben lévő PATH frissítéséhez szerkeszd a PATH környezeti változót a következő szintaxissal.
$ export PATH="<path_to_script>:$PATH"
Most az imént definiált “script” parancs közvetlenül elérhető lesz mindenféle elérési útvonal megadása nélkül : ugyanúgy elindíthatod, mint bármely más parancsot.
Figyelem : ha véglegesíteni szeretné a változtatásokat, kövesse ezeket a lépéseket a PATH változó megfelelő frissítéséhez.
Shell built-ins explained
Mielőtt bármilyen változót deklarálna a shell scriptjében, fontos, hogy ismerje a shell built-ins-t.
Amikor a Bash shell-el dolgozol, legtöbbször “programokat” hajtasz végre.
Példák a programokra: “ls”, “fdisk” vagy “mkdir”. Ezeknek a parancsoknak a súgóját a “man” parancs segítségével találod meg, amely a “manual” rövidítése.
Valamint, próbáltad már valaha elolvasni a “source” parancs dokumentációját?
A “man” segítségével nem tudnád elolvasni a dokumentációt, mivel a source parancs a shell beépített funkciója.
A shell beépített funkcióinak dokumentációjához a “help” parancsot kell használnod.
$ help <command>
A shell beépített parancsok listája meglehetősen terjedelmes, de itt van egy képernyőkép minden olyan bash beépített parancsról, amely megtalálható az Ubuntu rendszereken.
Bash-változók használata
Most, hogy már ismeri a Bash beépített moduljait, itt az ideje, hogy elkezdje írni a saját Bash-szkriptjeit.
Emlékeztetőül: a terminálba beírt parancsok pontosan ugyanúgy használhatók egy Bash szkriptben.
Ha például olyan szkriptet szeretnél, amely egyszerűen végrehajtja az “ls -l” parancsot, egyszerűen szerkeszd meg a szkriptedet, add hozzá a shebang sort és a parancsot.
#!/bin/bash# This simple script executes the ls commandls -l
Most, mi lenne, ha Bash változókat szeretnél?
A Bash-változók olyan egyszerű programváltozók, amelyek a legkülönbözőbb bemeneti adatok tárolására alkalmasak.
A Bash-változó deklarálásához egyszerűen adja meg a változó nevét és értékét egyenlőségjellel elválasztva.
VAR=value
Hogy a Bash-változó tartalmát felhasználhassa a szkriptjében, használja a “$” szót, és csatolja hozzá a változó nevét.
echo $VAR
Még ha ezt a szintaxist is használhatja ahhoz, hogy a változó értéke meglegyen, használhatja a “zárójeles” jelölést is.
echo ${VAR}
Ezzel a szintaxissal a változókat kombinálhatja.
Ha például van két VAR1 és VAR2 nevű Bash-változója, akkor a következő szintaxissal mindkettőt kiírhatja
echo "${VAR1}${VAR2}"
Parancsok végrehajtása szkripteken belül
A Bash-szkripteken belüli parancsok végrehajtásához parancshelyettesítést kell használnia.
A parancshelyettesítés a Bash kagylókban használt technika arra, hogy egy parancs eredményét egy változóban tároljuk.
A parancs helyettesítéséhez a Bashben használjuk a dollárjelet, és zárójelbe zárjuk a parancsot.
VAR=$(command)
Ha például az aktuális könyvtárban lévő fájlok számának eredményét szeretnénk megkapni, akkor azt írjuk
#!/bin/bashNUMBER=$(ls -l | wc -l)echo "${NUMBER} files in this directory!"
Mint láthatjuk, a parancshelyettesítés nagyon praktikus, mert a parancsok dinamikus végrehajtására használható egy shell-szkriptben, és az értéket visszaadhatjuk a felhasználónak.
Apropó, az eredmények visszaadása a végfelhasználónak, hogyan kezeli a nem megfelelően befejezett szkripteket?
Mi van akkor, ha egy parancs a szkriptben nem megfelelően hajtódott végre?
A kilépési állapotok megértése
A szkript végrehajtása során, még ha nem is ad vissza értéket, a szkript mindig visszaadja azt, amit kilépési állapotnak nevezünk.
A kilépési állapot a Bash szkriptelésben azt jelzi, hogy a szkript végrehajtása sikeres volt-e vagy sem.
Ha az állapotkód nulla, a szkript végrehajtása sikeres volt. Ha azonban az érték eltér a nullától (mondjuk egy, kettő vagy több), az azt jelzi, hogy a szkript végrehajtása nem volt sikeres.
A kilépési állapot bemutatásához futtassunk bármilyen érvényes parancsot a bash shellben.
echo "This is a simple working command"
Most használjuk ezt a parancsot, hogy megvizsgáljuk az utoljára végrehajtott parancs kilépési állapotát.
echo ${?}
Amint láthatjuk, ennek a parancsnak a kimenete “0”, vagyis az utoljára végrehajtott parancs kilépési állapota.
Ezt a szintaxist (“${?}”) használhatjuk a szkriptekben, hogy megbizonyosodjunk a parancsok megfelelő végrehajtásáról.
A kilépési állapotot használhatjuk a szkriptekben, hogy egy adott állapotkóddal lépjünk ki a szkriptből.
Ha például hibával szeretnénk kilépni a szkriptből, akkor a következő parancsot használhatjuk a szkriptben.
exit 1
Hasonlóképpen használhatjuk a “nulla” kilépési kódot is, hogy megadjuk, hogy a szkript sikeresen végrehajtódott.
exit 0
Az állapotkód helyességének ellenőrzéséhez olyan alapvető feltételes utasításokra lesz szükséged, mint az IF utasítás.
Feltételek kezelése a Bashben
Néha a bash szkriptek végrehajtása nem csak arról szól, hogy több parancsot kell egymás mellé tenni : feltételes műveleteket akarsz.
Némely esetben hasznos lehet egy olyan feltétel, amely ellenőrzi, hogy az aktuális felhasználó a root felhasználó-e (vagy csak egy adott felhasználó a rendszerben).
A feltételek egyik egyszerű módja a Bashben az if utasítás használata.
Az “If” a shell beépített, ennek következtében a kézikönyv a “help” parancson keresztül érhető el
$ help if
A súgóoldal az if parancs szintaxisát pontosvesszőkkel írja le, de mi ezt a szintaxist fogjuk használni (ami egyenértékű)
if ]then <commands>else <command>fi
Gyakorlati eset : annak ellenőrzése, hogy a felhasználó root-e
Az if utasítás felhasználhatóságának bemutatására egy egyszerű szkriptet fogunk írni, amely azt ellenőrzi, hogy egy felhasználó root-e vagy sem.
Emlékeztetőül: a root felhasználó UID-je minden Unix rendszerben mindig nullára van állítva.
Az információ ismeretében ellenőrizzük, hogy az UID nullára van-e állítva, ha ez a helyzet, akkor végrehajtjuk a szkript további részét, ellenkező esetben kilépünk a szkriptből.
Amint azt más oktatóprogramokban (a felhasználói adminisztrációról) elmagyaráztuk, az aktuális felhasználói azonosítót az “id” parancs segítségével kaphatjuk meg.
$ id -u1000
Ezt a parancsot fogjuk használni annak ellenőrzésére, hogy a szkriptet végrehajtó felhasználó root-e vagy sem.
Készítsünk egy új szkriptet, és adjuk hozzá a shebang sort.
#!/bin/bash
Jobbra alatta adjuk hozzá az “id” parancsot, és az eredményt a “USERID” nevű változóban tároljuk a parancs helyettesítésével.
USERID=$(id -u)
Most, hogy a “USERID” tartalmazza az aktuális felhasználói azonosítót, használjunk egy IF utasítást annak ellenőrzésére, hogy a felhasználói azonosító nulla-e vagy sem.
Ha ez a helyzet, írjunk egy egyszerű tájékoztató üzenetet, ha nem, akkor lépjünk ki a szkriptből 1-es kilépési státusszal.
if ]then echo "This is root"else exit 1fi
Ha most a szkriptet az aktuális felhasználóként hajtjuk végre, a szkript egyszerűen egyes kilépési státusszal fog kilépni.
Most próbálja meg root felhasználóként (a sudo paranccsal)
Mint látja, a tájékoztató üzenete megjelent, és a szkript nullás hibakóddal lépett ki.
Következtetés
Ezzel a bemutatóval megismerkedett a Bash programozási nyelvvel, és azzal, hogy hogyan lehet használni a Bash szkriptek létrehozásához a rendszerén.
Megtanulta a kilépési állapotokat és a feltételes utasításokat is, amelyek kulcsfontosságúak ahhoz, hogy a szkriptekbe egyéni logikát állítson be.
Most, hogy már több ismerettel rendelkezik a Bash-ről, érdemes elkezdenie saját szkriptek írását a saját igényeinek megfelelően : kezdheti például az archív biztonsági mentési fájlok létrehozásának bemutatásával.
Ha érdekli a Linux rendszeradminisztráció, a weboldalon egy teljes szekciót szentelünk neki, úgyhogy mindenképpen nézze meg!
Most, ha érdekli a Linux rendszeradminisztráció, egy teljes szekciót szentelünk neki a weboldalon, úgyhogy mindenképpen nézze meg!