Shell scriptek – változók alapfokon

A mai rész nagyon elméletinek fog tűnni, de ez csak a látszat. A ma megismert változók hasznosak lesznek, főleg, ha ezeket megfelelőképp használjuk. A változók egyike azoknak a dolgoknak, amelyek meglehetősen könnyen kezelhetők, kezes jószágok, de ugyanakkor nagyon könnyű bajba sodorni magukat, ha nem értjük őket. Mint minden, ez sem egy agysebészet, és elolvasva egyszerűnek tűnik, de időt vesz igénybe, hogy megértsd őket. Ha végigpróbálgatod, amit leírok, és a változók ellenőrzését folyamatosan megteszed, akkor a befektetett idő megtérül. Bár a shell scriptekben használható változókat jól lehet variálni, sokféle mód felhasználni kezdetben maradjunk a lehető legegyszerűbb megoldásoknál.

Mi is a változó?

Egy egyszerű tárolása hosszabb információnak. Egy azonosítót kaphat hosszabb, bonyolultabb információ, majd azzal a rövidke, statikus azonosítóval hivatkozunk a hosszú, esetleg akkor elkészülő adatsorra. Az első mini példa már érthetővé teszi!

Három feladtunk van a változóval, ebből kettőt mindenképp használni fogunk.

  • Meg kell határozni a változót
  • Hivatkozni kell rá, amikor használni akarjuk
  • Törölni lehet, ha kell (ezzel nem foglalkozom most)

Változó megadása shell scriptben

nev=ezegyváltozóértékeamibármilehet

Azaz van egy neve, ami azt a változót határozza meg. Itt használhatsz kis, vagy nagy betűt, számot, vagy vegyesen. Érdemes beszélő nevet használni, azaz a var1, var2 stb. nem túl jól kezelhető számomra. Legyen rövid a név, és kövessen olyan szabályt, ami neked kényelemes. Az teljesen mindegy, hogy nagy kezdőbetűvel indítod, vagy végig nagy, vagy végig kicsi betű, csak menet közben ne keljen gondolkodni a megadásnál, hogy milyen a pontos írásmódja. Igen sok időt vesz el a hibakeresés, ha egy több száz sorból álló scriptben a nev a változó neve, de egy helyen a Nev-ként hivatkozol rá! Ne használj benne szóközt és fura karaktereket. Jobb a békesség!

A változó bárhol elhelyezhető a scriptben, de praktikus (hacsak valami komoly más oka nincs) az elején felsorolni őket.

Amire nagyon figyelj: az egyenlőség jel egyik felén sincs space, azaz üres hely.

Aki már hallott programozásról, vagy programozott: érdemes megjegyezni, hogy itt nem kell definiálni a típusát, itt nincs megkülönböztetve típusok szerint. Egy változó lehet bármi, amit használni akarsz, de azt is érdemes tudni, hogy hiába adsz meg két változónak A és B betűt, azt nem kezeli semmiképp számként, azaz nem tudod őket összeszorozni. Logikus, mert ezek nem számok, de sokakat megtéveszt, hogy nem kell megadni a változó típusát, és mindent egyformán adunk meg.

Hivatkozás változóra a shell scriptben

Ha egy változóra hivatkozunk, akkor egy $ jelet helyezünk a változó neve elé. Így a script belsejében szükségünk van a ezegyváltozóértékeamibármilehet karaktersorra, csak azt írjuk le:

$nev

Próbáljuk is ki, a fenti nagyon komoly változó lesz a példa:

#!/usr/bin/bash

nev=ezegyváltozóértékeamibármilehet

echo $nev

Már valóban mindent tudunk a változókról! Érdemes megjegyezni ezt a echo-s megoldást, mert ha bizonytalan vagy abban, hogy az adott helyen a változó értéke pontosan mi, akkor csak ki kell íratni a terminálra az echo paranccsal. Ez fontos lehet, hiszen egy változó értékével dolgozunk az adott pillanatban.

A $ és a változó neve közt itt sincs space!

A változók hasznosak lehetnek a szkriptek kezelésének megkönnyítésében. Lehet, hogy a szkriptünk több parancsot fog futtatni, amelyek közül több egy adott könyvtárra, eszközre, fájlra hivatkozik. Ahelyett, hogy ezt a könyvtárat stb. minden alkalommal beírnánk, egyszer beállíthatjuk egy változóban, akkor hivatkozunk erre a változóra. Akkor, ha a szükséges könyvtár, vagy ami a változóban volt a jövőben megváltozik, csak egy változót kell frissítenünk, és nem a szkript minden sorát átnézni.

Változó a változóban

Értelemszerűen majdnem mindenhol használhatunk változót, így egy újabb változóban is. A példa megint egyszerű lesz, de szemléletes:

#!/usr/bin/bash

nev=Laci
irdki="Szia $nev!"

echo $irdki

Ha kipróbáltad, akkor látható, hogy az irdki változó felhasználta a nev változó adatát.

Most egy kényes témához értünk, amit mindig érdemes figyelemmel kezelni.

Szeparáció, idézőjellel

Ahogy láttad az irdki változót egy idézőjel követett. Ez fontos dolog, mert többféle idézőjel van, és nem egyforma a hatásuk.

  • A dupla idézőjellel összefogott területen lehetnek parancsok, változók.
  • Ha egyszeres idézőjelet használsz, ott a köztük lévő rész szó szerint (azaz a parancs végrehajtása nélkül, a változó behelyettesítése nélkül) lesz alkalmazva.

Itt is érdemes kipróbálni a fenti scriptet egyszeres idézőjellel. Máris komoly tapasztalatra tettünk szert a próbával. Ha ezt megjegyzed, akkor nem lesz komolyabb problémád ezzel. Ha pedig valami nem úgy viselkedik, ahogy vártad, erre is gondolj. Sajnos nem mindig és nem feltétlen fog minden elsőre működni, és (nálam) a legtöbb hibát az idézőjelek adják.

Ha egy egyszer nev=akármi szerkezeten túlmutat a változó, akkor már érdemes idézőjelet használni, mert egy egyszerű nev=akarmi masvalami szerkezet is fura mód érvényesül. Írasd ki ezt a változót echo-val, és látod, hogy a masvalami már külön parancsként kerülne feldolgozásra, ami nem fog sikerülni. Az a jó pld. a sublimetext-ben (szövegszerkesztő, kódkiemeléssel), hogy azonnal látod, hogy ott valami gond van!

Ha eddig nem ment el a kedved a változóktól, akkor léphetünk tovább.

Parancsok a változókban

Változó bármi lehet, így változóként hivatkozhatunk egy parancs eredményére is. A példa megint faék egyszerű lesz:

#!/usr/bin/bash

nev=$(date)

echo $nev

A date parancsot tettem be a nev változóba, ami kiírja az aktuális dátumot. A szerkezete itt is nagyon egyszerű: az egész parancs zárójelbe kerül, ezzel fogod össze, és előtte $ jel van. Nyilván egy sima parancsot nem szoktunk beírni változóba, mert nem igazán van előnye, de ha a parancs már összetettebb, és sokszor felhasználásra kerül a scriptben, akkor már érdemes azt egyszerűsíteni. Egy $( ls | wc -l ) az még kérdéses, de a  (free -mt | grep Total | awk ‘{print $4}’) már egy kicsit hosszabb amit már érdemes változóba tenni, hiszen egy pár betűs változónevet könnyebb elhelyezni több helyen, és ha kell akkor a definiálásnál megváltoztatni.
A bash, pontosabban a shell-ek ismernek jó pár belső, saját változót is.

Parancssori argumentumok

Ezek azok a változók, amiket vagy nem te adsz meg, mert a shell tárolja, vagy a script, a program indításakor bekéred a felhasználótól, a parancs beírásakor.
Ezek a $0 $1 $2 stb. változók. A $0 maga a script neve, a többi értelemszerűen az első, második stb. kapcsoló, amit elvársz a felhasználótól. Ezeket a shell rendszer automatikusan beállítja, amikor futtatjuk a szkriptet, így csak annyit kell tennünk, hogy utalj rájuk. Illetve az sem árt, ha a leírásban elmondjuk a felhasználónak, hogy milyen sorrendben, mit kell megadni.

Írjunk egy nagyon „profi” scriptet a másolásra. Ezt a cp paranccsal oldjuk meg,

#!/bin/bash

# Másoló script példa
cp $1 $2

# Ellenőrizzük, hogy működött-e

echo $2
ls -lh $2

Az első paraméter amit a cp elvár az a „mit”, a második a „hova”. Ha a teszt.sh-t futtatod, és megadod az első paraméterének azt a fájlt, amit másolni akarsz, a másodiknak a célt, akkor a

./teszt.sh mit cél

magadásával az első, a $1 paraméter a mit lesz, a második paraméter a $2 azaz hova másoljon
A már ismert honlapfigyelőnél is használhattuk volna a scriptban ezt, és akkor nem a scriptbe írjuk bele a honlapot, amit figyelni akarunk, hanem paraméterként adjuk meg. Van, amikor ez gyorsabb, mert a scriptet nem kell megnyitni.
A script második felében kiíratjuk a második paramétert, majd egy ls paranccsal ellenőrízük, hogy van-e olyan fájl, amit készíteni akartunk.
Gyakorlásnak írjunk egy olyan sort a végére, ami kiírja, hogy a script lefutott, és szerepeljen benne a lefutott script neve is. A $0 a script neve, és valami echo „A $0 lefutott” vagy ehhez hasonló kellene…

Ezenkívül van pár egyéb
$0 – a Bash szkript neve.
$1-$9 – a Bash szkript első 9 argumentuma.
$# – Hány érvet továbbítottak a Bash szkripthez.
$@ – A Bash parancsfájlhoz mellékelt összes argumentum.
$? – A legutóbb futtatott folyamat kilépési állapota.
$$ – az aktuális szkript folyamatazonosítója.
$USER – a szkriptet futtató felhasználó felhasználóneve.
$HOSTNAME – A gép gazdagépneve, amelyen a szkript fut.
$SECONDS – A szkript elindítása óta eltelt másodpercek száma.
$RANDOM – Véletlenszerű számot ad vissza, minden hivatkozás esetén mást.
$LINENO – Visszaadja az aktuális sor számát a Bash szkriptben.

Ezeket érdemes kijegyzetelni, mert időnként érdekes lehet. A $0-$9 a legtöbbet használt, így a script indításakor bekérhetsz adatokat a felhasználótól, és nem kell menet közben bekérni. Erre is van lehetőség, de sokszor kényelmesebb, ha megkapja az elején az összes elvárt adatot a shell script.

Mára ennyit szántam, bár a téma most még elég elméletinek tűnhet, de később nagyon hasznos lesz. Készítsd el a példa scripteket, futtasd le őket, játssz kicsit az idézőjelekkel, a paraméterekkel, a parancsok helyettesítésével. Valóban egyszerűek a szerkezetek, de sokszor belekeverednek az emberek…

A következő részt június 27-re időzítettem, és már komolyabb témát veszünk.

Related Posts