A parancssor további lehetőségei
Ebben a cikkben bemutatunk néhány fontosabb utasítást és segédprogramot, amelyek a parancssor hatékonyságában nagy szerepet játszanak.
A shellnek az előző cikkben bemutatott parancsain kívül van még rengeteg, ezek közül az if és a for érdemel első körben külön említést.
A programozásban kicsit jártasabbak számára egyik sem lehet ismeretlen. Az if egyik leggyakoribb használata az, amikor file-ok vagy értékek tulajdonságát vizsgáljuk. Szintaxisa: if kifejezés; then kifejezés; [ elif kifejezés; then kifejezés ]; ... [ else kifejezés ]. Segítségével kulturáltan működő és intelligens shell scripteket írhatunk. Nézzünk egy példát:
if [ -e irdki.txt ]; then cat irdki.txt; fi
Ez a sor kiírja az irdki.txt-t, de csak akkor, ha az létezik. Megfigyelhetjük, hogy az utasítást a fi zárja le; minden, a fi előtt álló utasítás a feltétel része. A kulcsszavak lezárására a visszafelé olvasást más esetben is alkalmazzák (case-esac). A file vizsgálatát az if argumentumában levő "-e" végzi el. Mivel a "-e irdki.txt" a shell számára önmagában nem értelmezhető, szögletes zárójelek közé van téve. Ez így a test utasítás, amely a file-ok vizsgálatán kívül képes logikai kapcsolatok értelmezésére is. Ilyenformán az
if [ kifejezés1 -a kifejezés2 ]
akkor fog teljesülni, ha kifejezés1 és kifejezés2 is igaz. A "-a" itt az and-et jelenti. Nézzünk erre is egy példát:
if [ -e irdki.txt -a -e irdki2.txt ]; then cat irdki.txt irdki2.txt; fi
Ez kiírja az irdki.txt-t és az irdki2.txt-t is, de csak akkor, ha mindkettő létezik. A "-a"-hoz hasonlóan "-o"-t is alkalmazhatunk, ezzel vagy kapcsolatot adunk meg. Változók egyenlőségének vizsgálatára az "=" használható; a különbözőséget a "!=" operátorral állapíthatjuk meg. A "!", mint tagadás, máshol is alkalmazható, például a "! -e" akkor fog teljesülni, ha az adott file nem létezik.
File-ok vizsgálatára több más operátor is alkalmazható, néhány hasznosabb:
for i in *jpeg; do mv $i `basename $i .jpeg`.jpg; done
Ebben a sorban a basename parancs is a segítségünkre van: a paraméterként adott sztring - jelen esetben az éppen aktuális ciklusváltozó, azaz szép sorban, egyenként az összes jpeg végződésű file neve - végéről levágja a második paraméterében szereplő sztringet. Így a kép.jpeg-ből kép-et csinál. Mindez visszafelé aposztrófok között van, azaz a shell végrehajtja, és az eredményét teszi a helyére; ezután hozzáfűzzük a .jpg végződést, és ez lesz a mv második paramétere, amely a file új nevét jelenti. Valójában kicsit redundánsak voltunk a szemléletesség kedvéért: a basename argumentumában elég lett volna a .jpeg helyett "eg"-t írni, az aposztróf bezárása után pedig "g"-t, ezzel a jpeg végződésű állományok végén az eg-t g-re cseréltük volna.
Másik hasznos példaként álljon itt annak a feladatnak a megoldása, melynek során jó sok jpg file-t meg szeretnénk számozni. Ez már picit bonyolultabb, itt segédváltozót kell bevezetnünk. A for-nak ugyan meg lehet adni felsorolva a ciklusváltozó majdani értékeit, de máshogyan nem: a
for i in 1 2 3 4 5 6...
kevés file esetén még működik, ha sok van belőle, akkor kezdődnek a gondok. A probléma áthidalására a következőt alkalmazhatjuk:
SZAM=1; for i in *jpg; do mv $i $SZAM.jpg; SZAM=$[$SZAM+1]; done
Először az 1 értéket adjuk a SZAM segédváltozónak, amelyben a sorszámot léptetjük. Elvégezzük az első file átnevezését, majd a SZAM értékét eggyel növeljük. Ebben a lépésben a $[...] gondoskodik arról, hogy a sztringváltozót aritmetikailag kiértékelje a shell, és ezt kapja a SZAM új értékül. Enélkül a SZAM második értéke 2 helyett "1+1" lett volna. Alkalmasint problémát okozhat, hogy az egyjegyű számokból képzett filenevek rövidebbek, és emiatt egy abc-be rendezett listában például a 10.jpg-19.jpg-k előbbre kerülnek, mint a 2.jpg. Ennek elkerülésére egyjegyű szám esetén egy 0-t fűzhetünk a szám elé; ez egy if beiktatásával könnyen elvégezhető.
A grep a szabványos bemenetére adott szövegből kikeresi a paraméterként kapott szöveg előfordulásait. Ha a szabványos bemenetre nem kap semmit, a filenevet is paraméterből veszi. Használata:
grep eztkeresem ebben.txt
Emellett sokszor jól jöhet még: például a
ls | grep eh
kiírja az összes olyan file nevét, amelyben az "eh" (a nevében) szerepel. Így ez ekvivalens az "ls *eh*" paranccsal. A grepnek rengeteg kapcsolót adhatunk meg, jól használható például a -v, amellyel azokat a sorokat kereshetjük, amikben az argumentum nem fordul elő; a -c pedig nem írja ki az előfordulásokat, hanem megszámolja őket és ezt a számot kapjuk eredményül. A grep hasznossága miatt - akárcsak a bash - már megtalálható DOS/Windows alá is.
A textutils csomag része a cat és a sort is, ezekről már az előző cikkben esett szó. Pár, nagyon gyakran használt kis segédprogram még:
A programozásban kicsit jártasabbak számára egyik sem lehet ismeretlen. Az if egyik leggyakoribb használata az, amikor file-ok vagy értékek tulajdonságát vizsgáljuk. Szintaxisa: if kifejezés; then kifejezés; [ elif kifejezés; then kifejezés ]; ... [ else kifejezés ]. Segítségével kulturáltan működő és intelligens shell scripteket írhatunk. Nézzünk egy példát:
Ez a sor kiírja az irdki.txt-t, de csak akkor, ha az létezik. Megfigyelhetjük, hogy az utasítást a fi zárja le; minden, a fi előtt álló utasítás a feltétel része. A kulcsszavak lezárására a visszafelé olvasást más esetben is alkalmazzák (case-esac). A file vizsgálatát az if argumentumában levő "-e" végzi el. Mivel a "-e irdki.txt" a shell számára önmagában nem értelmezhető, szögletes zárójelek közé van téve. Ez így a test utasítás, amely a file-ok vizsgálatán kívül képes logikai kapcsolatok értelmezésére is. Ilyenformán az
akkor fog teljesülni, ha kifejezés1 és kifejezés2 is igaz. A "-a" itt az and-et jelenti. Nézzünk erre is egy példát:
Ez kiírja az irdki.txt-t és az irdki2.txt-t is, de csak akkor, ha mindkettő létezik. A "-a"-hoz hasonlóan "-o"-t is alkalmazhatunk, ezzel vagy kapcsolatot adunk meg. Változók egyenlőségének vizsgálatára az "=" használható; a különbözőséget a "!=" operátorral állapíthatjuk meg. A "!", mint tagadás, máshol is alkalmazható, például a "! -e" akkor fog teljesülni, ha az adott file nem létezik.
File-ok vizsgálatára több más operátor is alkalmazható, néhány hasznosabb:
- -d: a file létezik, és az egy directory (valójában a directory egy speciális file)
- -s: a file létezik és nem 0 byte hosszú
- -r: a file létezik és olvasható
- -w: .. írható;
- -x: .. futtatható.
[oldal:A for]
A for parancssori alkalmazása a shell egyik legnagyobb előnye. Segítségével a gép végzi el azt a munkát, ami valóban a gépnek való, de for nélkül az emberre maradna. Tipikus eset, hogy egy könyvtárban levő sok file nevét valamilyen szisztéma szerint módosítani szeretnénk. Tegyük fel, hogy van mondjuk 80 db ".jpeg" kiterjesztésű kép, amit ".jpg"-vé szeretnénk nevezni. Ezt elég macerás lenne kézzel megtenni. (Hogy oldanánk ezt meg Windowsban?) Elég rá egyetlen sor:Ebben a sorban a basename parancs is a segítségünkre van: a paraméterként adott sztring - jelen esetben az éppen aktuális ciklusváltozó, azaz szép sorban, egyenként az összes jpeg végződésű file neve - végéről levágja a második paraméterében szereplő sztringet. Így a kép.jpeg-ből kép-et csinál. Mindez visszafelé aposztrófok között van, azaz a shell végrehajtja, és az eredményét teszi a helyére; ezután hozzáfűzzük a .jpg végződést, és ez lesz a mv második paramétere, amely a file új nevét jelenti. Valójában kicsit redundánsak voltunk a szemléletesség kedvéért: a basename argumentumában elég lett volna a .jpeg helyett "eg"-t írni, az aposztróf bezárása után pedig "g"-t, ezzel a jpeg végződésű állományok végén az eg-t g-re cseréltük volna.
Másik hasznos példaként álljon itt annak a feladatnak a megoldása, melynek során jó sok jpg file-t meg szeretnénk számozni. Ez már picit bonyolultabb, itt segédváltozót kell bevezetnünk. A for-nak ugyan meg lehet adni felsorolva a ciklusváltozó majdani értékeit, de máshogyan nem: a
kevés file esetén még működik, ha sok van belőle, akkor kezdődnek a gondok. A probléma áthidalására a következőt alkalmazhatjuk:
Először az 1 értéket adjuk a SZAM segédváltozónak, amelyben a sorszámot léptetjük. Elvégezzük az első file átnevezését, majd a SZAM értékét eggyel növeljük. Ebben a lépésben a $[...] gondoskodik arról, hogy a sztringváltozót aritmetikailag kiértékelje a shell, és ezt kapja a SZAM új értékül. Enélkül a SZAM második értéke 2 helyett "1+1" lett volna. Alkalmasint problémát okozhat, hogy az egyjegyű számokból képzett filenevek rövidebbek, és emiatt egy abc-be rendezett listában például a 10.jpg-19.jpg-k előbbre kerülnek, mint a 2.jpg. Ennek elkerülésére egyjegyű szám esetén egy 0-t fűzhetünk a szám elé; ez egy if beiktatásával könnyen elvégezhető.
[oldal:Néhány hasznos program]
Minden disztribúciónak része a textutils programcsomag, amely olyan parancssorból paraméterezhető segédprogramokat tartalmaz, amelyek szövegek átalakítását végzik. Emellett van a grep is, amellyel keresési feladatokat végezhetünk.A grep a szabványos bemenetére adott szövegből kikeresi a paraméterként kapott szöveg előfordulásait. Ha a szabványos bemenetre nem kap semmit, a filenevet is paraméterből veszi. Használata:
Emellett sokszor jól jöhet még: például a
kiírja az összes olyan file nevét, amelyben az "eh" (a nevében) szerepel. Így ez ekvivalens az "ls *eh*" paranccsal. A grepnek rengeteg kapcsolót adhatunk meg, jól használható például a -v, amellyel azokat a sorokat kereshetjük, amikben az argumentum nem fordul elő; a -c pedig nem írja ki az előfordulásokat, hanem megszámolja őket és ezt a számot kapjuk eredményül. A grep hasznossága miatt - akárcsak a bash - már megtalálható DOS/Windows alá is.
A textutils csomag része a cat és a sort is, ezekről már az előző cikkben esett szó. Pár, nagyon gyakran használt kis segédprogram még:
- head: A paraméterként adott file vagy a szabványos bemenet elejét írja ki. Például a head -10 szöveg.txt a szöveg.txt első 10 sorát adja tovább. Nem csak sorokra, hanem karakterekre is alkalmazható. (-c)
- tail: a head párja, a file vagy stdin végét adja eredményül. Hasznos opciója a -f, amellyel állományok, tipikusan logfile-ok növekedését követhetjük nyomon: a tail nem fog leállni, hanem ahogy a file növekszik, a végét rendre kiírja.
- wc: szokásos vegetatív célokat szolgáló használata mellett kiírja a file vagy stdin byte-jainak, szavainak és sorainak számát. Természetesen sokféleképp paraméterezhető.
- expand: a TAB karaktereket szóközökké konvertálja.
- unexpand: a szóközöket TAB karakterekké konvertálja.
- tr: karaktereket cserél le. Alkalmazható például nagybetűsről kisbetűsre történő átalakításra (sokszor lehet rá szükség a DOS-os idióta nagybetűs filenevek kezeléséhez).
- cut: a bemenet minden sorából kivág egy részt. Megadhatunk neki rengeteg paramétert, általában a mező számát (-f) és a mezőket elválasztó karaktert (-d) szokás. A cut szöveg.txt -d' ' -f1 például a szöveg.txt minden sorából kiírja az első szót: ez úgy adódik, hogy a cut a sorokat felosztja mezőkre, amiket a szóköz karakter választ el (-d' '), és ezekből az elsőt (-f1) írja ki.