mikkey at dynamo.com.ar
A dokumentum leg�jabb v�ltozata megtal�lhat� a http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html honlapon
J�l j�het, ha ismered a GNU/Linux rendszerek parancssor�t, �s hasznos, ha tiszt�ban vagy az alapvet� programoz�si elvekkel. Noha ez nem egy programoz�sba bevezet� le�r�s, sok ilyet is megpr�b�lok majd bemutatni.
Ez a dokumentum a k�vetkez� esetekben lehet hasznos:
A magyar ford�t�st Kov�cs Ferenc k�sz�tette (2004.06.18). A lektor�l�st Daczi L�szl� v�gezte el (2004.06.20). A dokumentum legfrissebb v�ltozata megtal�lhat� a Magyar Linux Dokument�ci�s Projekt honlapj�n. A dokumentum ford�t�sa a Szegedi Tudom�nyegyetem ny�lt forr�sk�d� szoftverfejleszt�s speci�lkoll�gium�nak seg�ts�g�vel val�sult meg.
Ez a HOGYAN megpr�b�l �tmutat�k�nt szolg�lni a shell szkriptek megismer�s�hez. A t�m�t gyakorlati oldalr�l, p�ld�kon kereszt�l k�zel�tj�k meg.
Az ebben a r�szben tal�lhat� n�h�ny p�lda rem�lhet�leg seg�t majd meg�rteni p�r alapvet� m�dszert.
#!/bin/bash
echo Hello World
A szkript csak k�t sorb�l �ll. Az els�ben jelezz�k a rendszernek, hogy melyik programot haszn�lja a szkript futtat�s�hoz.
A m�sodikban pedig ki�rjuk a "Hello World" sz�veget a termin�lra.
Ha a k�perny�n a ./hello.sh: Command not found. vagy ehhez hasonl� �zenet jelenik meg, akkor val�sz�n�leg az els� sorban l�v� "#!/bin/bash" lesz a ludas. A hiba jav�t�s�hoz m�dos�tsd az els� sort �gy, hogy az a bash t�nyleges el�r�si �tvonal�t tartalmazza. Az �tvonal lek�r�s�re haszn�lhat� a "whereis bash" parancs, vagy olvasd el "A bash felkutat�sa" c�m� fejezetet.
#!/bin/bash
tar -cZf /var/my-backup.tgz /home/me/
Ebben a szkriptben, az el�z�t�l elt�r�en, nem sz�veget jelen�t�nk meg a k�perny�n, hanem a felhaszn�l� "home" k�nyvt�r�ban l�v� f�jlokat �sszef�zz�k egyetlen tar f�jlba. Ez csak a p�lda kedv��rt szerepel most itt, k�s�bb egy sokkal haszn�lhat�bb backup szkriptet is bemutatunk.
H�rom f�jlle�r� van: stdin, stdout �s stderr (std=standard).
Alapvet�en a k�vetkez�k tehet�k meg:
Egy kis magyar�zat, hogyan is kell mindezt �rteni: a less paranccsal meg tudod n�zni mind az stdout "tartalm�t" (ami a bufferen marad), mind az stderr-�t, ami a k�perny�n jelenik meg, de t�rl�dik, amint olvasni pr�b�lod a buffert.
Ennek hat�s�ra a program kimenete f�jlba �r�dik.
ls -l > ls-l.txt
Itt l�trej�n az "ls-l.txt" nev� f�jl, melynek tartalma meg fog egyezni
azzal, amit az "ls -l" parancs futtat�sakor a k�perny�n l�tn�l.
Hat�s�ra a program stderr kimenete f�jlba �r�dik.
grep da * 2> grep-errors.txt
Itt is l�trej�n a "grep-errors.txt" nev� f�jl, melynek tartalma a "grep
da *" parancs stderr kimenet�vel fog megegyezni.
Ennek hat�s�ra a program stderr kimenet�re lesznek �rva az stdout-ra k�ld�tt adatok is.
grep da * 1>&2
Itt a parancs stdout kimenete az stderr-re lesz elk�ldve, ahogy ezt
m�r bizony�ra �szrevetted.
Most a program stderr kimenete az stdout-nak megfelel� f�jlle�r�ba lesz �rva.
grep * 2>&1
Itt az stderr-ra k�ld�tt adatok is az stdout-on jelennek meg. Ha ezt egy
cs�vel (pipe) �sszek�t�d a less programmal l�thatod, hogy azok a sorok, amik
norm�lis esetben elt�nn�nek (mivel az stderr-ra �rtuk �ket), most
megmaradnak (hiszen az stdout-ra lettek ir�ny�tva).
Ebben az esetben a program minden kimenete f�jlba ker�l. Ez n�ha hasznos lehet p�ld�ul a cron bejegyz�sek eset�n, ha egy programot teljes cs�ndben akarsz futtatni.
rm -f $(find / -name core) &> /dev/null
Ez (gondolva itt a cron bejegyz�sekre) minden k�nyvt�rb�l kit�rli a "core"
nev� f�jlokat. Fontos tiszt�ban lenned azzal, hogy egy program
pontosan mit is csin�l, miel�tt "megsz�nteted" a kimenet�t.
Ebben a fejezetben a cs�vek haszn�lat�nak egy egyszer� �s hasznos m�dj�t ismertetj�k, valamint elmondjuk hol lehet sz�ks�ged r�juk.
A cs�vek olyan egyszer� eszk�z�k, melyek lehet�v� teszik, hogy egy program bemenet�t egy m�sik program kimenet�r�l vegye.
Ez a cs�vek haszn�lat�nak egy nagyon egyszer� m�dja.
ls -l | sed -e "s/[aeio]/u/g"
Itt a k�vetkez� t�rt�nik: el�sz�r az ls -l parancs v�grehajt�dik, de a
kimenete nem lesz ki�rva a k�perny�re, hanem el lesz k�ldve a sed
programnak, ami ezt bemenetk�nt �rtelmezi �s ebb�l el��ll�tja saj�t
kimenet�t.
A k�vetkez� parancs minden bizonnyal sokkal bonyolultabb, mint a szok�sos ls -l *.txt, de a cs�vek tulajdons�gainak illusztr�l�s�ra j� p�lda. A gyakorlatban ilyen list�z�si probl�m�k megold�s�ra lehet�leg ne haszn�ljunk cs�veket.
ls -l | grep "\.txt$"
Itt az ls -l program kimenete el lesz k�ldve a grep programnak, ami
ki�rja azokat a sorokat, melyek illeszkednek a "\.txt$" regul�ris
kifejez�sre.
Ugyan�gy haszn�lhatsz v�ltoz�kat, mint b�rmely m�s programoz�si nyelvben. Adatt�pusok nincsenek. Egy bash v�ltoz� t�rolhat sz�mot, karaktert �s karakterekb�l �ll� sztringet.
A v�ltoz�kat nem kell k�l�n deklar�lni, a r�juk val� hivatkoz�skor automatikusan l�trej�nnek.
#!/bin/bash
STR="Hello World!"
echo $STR
A m�sodik sorban l�trej�n egy STR nev� v�ltoz�, melynek �rt�ke a "Hello World!" (sztring) lesz. Ezut�n a v�ltoz� neve el� tett "$" jellel tudjuk el�rni annak �rt�k�t. Jegyezd meg (�s pr�b�ld is ki), hogy ha nem haszn�lod a "$" jelet, a program kimenete m�s lesz �s val�sz�n�leg nem az, amit szeretn�l.
#!/bin/bash
OF=/var/my-backup-$(date +%Y%m%d).tgz
tar -cZf $OF /home/me/
Ez a szkript felvet egy m�sik dolgot is. De mindenek el�tt tiszt�ban kell lenned a v�ltoz�k l�trehoz�s�val, az �rt�kad�ssal kapcsolatos dolgokkal (ez a m�sodik sorban l�that�). Most vegy�k szem�gyre a "$(date +%Y%m%d)" kifejez�st. Ha futtatod a szkriptet a z�r�jelek k�zti parancs is lefut, l�trehozva kimenet�t.
Azt is vegy�k �szre, hogy a kimeneti f�jl neve minden nap m�s �s m�s lesz, a date parancs form�tum-kapcsol�inak (+%Y%m%d) k�sz�nhet�en. Ezt m�dos�thatod m�s form�tum megad�s�val.
M�g n�h�ny p�lda:
echo ls
echo $(ls)
Lok�lis v�ltoz�kat a local kulcssz�val tudunk l�trehozni.
#!/bin/bash
HELLO=Hello
function hello {
local HELLO=World
echo $HELLO
}
echo $HELLO
hello
echo $HELLO
Ennek a p�ld�nak el�gnek kell lennie, hogy bemutassa a lok�lis v�ltoz�k haszn�lat�t.
A felt�teles utas�t�sok seg�ts�g�vel d�nthet�nk, hogy v�grehajtunk-e valamit vagy nem. A d�nt�s itt egy kifejez�s ki�rt�kel�s�b�l �ll.
A felt�teles utas�t�soknak t�bb form�ja is van. A legalapvet�bb a k�vetkez�: if kifejez�s then utas�t�s, ahol az "utas�t�s" csak akkor ker�l v�grehajt�sra, ha a kifejez�s, ki�rt�kel�se ut�n igazat ad vissza. P�ld�ul a "2<1" kifejez�s ki�rt�kel�s ut�ni �rt�ke hamis, m�g a "2>1" eset�n igaz.
A m�sik eset: if kifejez�s then utas�t�s1 else utas�t�s2. Az "utas�t�s1" akkor hajt�dik v�gre, ha a kifejez�s igaz, egy�b esetben az "utas�t�s2" ker�l v�grehajt�sra.
A felt�teles utas�t�s egy m�sik form�ja: if kifejez�s1 then utas�t�s1 else if kifejez�s2 then utas�t�s2 else utas�t�s3. Ebben az esetben csak az "ELSE IF 'kifejez�s2' THEN 'utas�t�s2'" r�szt adtuk hozz�, �gy az utas�t�s2 akkor lesz v�grehajtva, ha a kifejez�s2 ki�rt�kel�s ut�ni �rt�ke igaz. A t�bbit m�r magad is el tudod k�pzelni (n�zd meg az el�z� form�kat).
P�r sz� a szintaxisr�l:
Bash-ban az "if" szerkezetek a k�vetkez�k�pp n�znek ki:
if [kifejez�s];
then
a "kifejez�s" igaz volta eset�n v�grehajt�d� k�d
fi
#!/bin/bash
if [ "foo" = "foo" ]; then
echo a felt�tel igaz
fi
A sz�gletes z�r�jelbe tett kifejez�s igaz �rt�ke eset�n v�grehajt�d� k�d a "then" kulcssz� ut�n �s a "fi" kulcssz� el�tt helyezkedik el. A "fi" kulcssz� jelzi a felt�telesen v�grehajtand� k�d v�g�t.
#!/bin/bash
if [ "foo" = "foo" ]; then
echo a felt�tel igaz
else
echo a felt�tel hamis
fi
#!/bin/bash
T1="foo"
T2="bar"
if [ "$T1" = "$T2" ]; then
echo a felt�tel igaz
else
echo a felt�tel hamis
fi
Ebben a r�szben a for, while �s until ciklusokr�l lesz sz�.
A for ciklus egy kicsit elt�r a m�s nyelvekben megszokottakt�l. Alapvet�en egy sztringekben szerepl� szavak halmaz�nak feldolgoz�s�ra haszn�ljuk.
A while ciklus addig ism�tli a ciklusmagot, am�g a ciklusfelt�tel hamiss� nem v�lik (vagy ki nem ugrunk a ciklusmagb�l a break utas�t�ssal).
Az until ciklus tulajdonk�ppen azonos a while ciklussal, a k�l�nbs�g csup�n annyi, hogy az ism�tl�s addig folytat�dik, am�g a felt�tel hamis.
Ha gyan�s volt sz�modra, hogy a while �s az until ciklusok mennyire hasonl�k, akkor igazad volt.
#!/bin/bash
for i in $( ls ); do
echo elem: $i
done
A m�sodik sorban deklar�ltunk egy "i" nev� v�ltoz�t, ami majd sorra felveszi a $( ls ) sztring k�l�nb�z� �rt�keit.
A harmadik sor sz�ks�g eset�n m�retesebb is lehet, vagy t�bb sor is szerepelhet a ciklusmagban a done (4. sor) kulcssz� el�tt.
A "done" (4. sor) jelzi, hogy a $i �rt�ket haszn�l� k�dr�szlet befejez�d�tt. Innent�l kezdve a $i �j �rt�ket vehet fel.
Ennek a szkriptnek �gy nem sok �rtelme van. A for ciklus haszn�lat�nak egy sokkal hasznosabb m�dja, ha az el�z� p�ld�n�l csak bizonyos f�jlokat vizsg�lunk.
Fiesh tan�cs�ra ker�lt ide ez a p�lda, ami egy C/Perl-szer� for ciklust mutat be.
#!/bin/bash
for i in `seq 1 10`;
do
echo $i
done
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]; do
echo A sz�ml�l� �rt�ke: $COUNTER
let COUNTER=COUNTER+1
done
Ez a szkript a j�l ismert "for" ciklust ut�nozza (C, Pascal, perl, stb.).
#!/bin/bash
COUNTER=20
until [ $COUNTER -lt 10 ]; do
echo COUNTER $COUNTER
let COUNTER-=1
done
Mint a legt�bb programoz�si nyelvben itt is haszn�lhatunk f�ggv�nyeket a k�d logikailag �sszetartoz� r�szeinek csoportos�t�s�ra, vagy ha csak �ldozni szeretn�nk a rekurzi� virtu�lis olt�ra el�tt (azaz ha rekurz�v f�ggv�nyeket akarunk �rni).
A f�ggv�nydeklar�ci� csup�n ennyib�l �ll: function my_func { my_code }.
A f�ggv�ny h�v�sa pedig ugyan�gy t�rt�nik, mint b�rmelyik program eset�n, csak le�rjuk a nev�t.
#!/bin/bash
function quit {
exit
}
function hello {
echo Hello!
}
hello
quit
echo foo
A 2-4 sorok tartalmazz�k a "quit", az 5-7 sorok pedig a "hello" f�ggv�nyt. Ha nem teljesen vil�gos sz�modra, hogy mit is csin�l a szkript, pr�b�ld ki!
Megjegyzend�, hogy a f�ggv�nydeklar�ci� sorrendje tetsz�leges.
Amikor lefuttatjuk a szkriptet l�tjuk, hogy el�sz�r a "hello", majd a "quit" f�ggv�nyek h�v�dnak meg �s a program sohasem �ri el a 10. sort (echo foo).
#!/bin/bash
function quit {
exit
}
function e {
echo $1
}
e Hello
e World
quit
echo foo
Ez a szkript nagyr�szt megegyezik az el�z�vel. A f� k�l�nbs�g az "e" nev� f�ggv�nyben rejlik, ami nem csin�l m�st, mint ki�rja az els� �tvett argumentumot. A f�ggv�nyekn�l szerepl� argumentumok ugyan�gy kezelhet�k, mint a szkriptnek �tadott argumentumok.
#!/bin/bash
OPTIONS="Hello Quit"
select opt in $OPTIONS; do
if [ "$opt" = "Quit" ]; then
echo done
exit
elif [ "$opt" = "Hello" ]; then
echo Hello World
else
clear
echo rossz v�lasz
fi
done
Ha lefuttatod a szkriptet l�thatod, hogy ez a programoz�k �lma, ha sz�veges men�kr�l van sz�. Biztos �szrevetted, hogy ez nagyon hasonl�t a "for" ciklusra. Csak itt ahelyett, hogy minden $OPTIONS elemre egyszer�en v�grehajtan�nk a ciklust, mindig "meg�ll�tjuk" a felhaszn�l�t.
#!/bin/bash
if [ -z "$1" ]; then
echo haszn�lat: $0 k�nyvt�rn�v
exit
fi
SRCD=$1
TGTD="/var/backups/"
OF=home-$(date +%Y%m%d).tgz
tar -cZf $TGTD$OF $SRCD
Vil�gosnak kell lennie sz�modra annak, hogy ez a szkript mit csin�l. Az els� felt�telben szerepl� kifejez�ssel megn�zz�k, hogy a program kapott-e argumentumot ($1). Ha nem, kil�p�nk, �s egy haszn�lati �tmutat�t jelen�t�nk meg a felhaszn�l�nak. A program t�bbi r�sz�nek ezen a ponton m�r tiszt�nak kell lennie.
Sok esetben sz�ks�g lehet arra, hogy adatokat k�rj�nk be a felhaszn�l�t�l. Erre sz�mos lehet�s�g�nk van, melyek k�z�l egy a k�vetkez�:
#!/bin/bash
echo K�rlek add meg a neved
read NAME
echo "Hi $NAME!"
A read seg�ts�g�vel egyszerre t�bb adatot is be tudsz olvasni. A k�vetkez� p�lda ezt tiszt�zza.
#!/bin/bash
echo K�rlek add meg a vezet�k- �s keresztneved
read FN LN
echo "Hi! $LN, $FN !"
A parancssorba (vagy a shell-be) �rd be a k�vetkez�t:
echo 1 + 1
Ha "2"-t v�rt�l eredm�ny�l bizony�ra csal�dott vagy. De mi van akkor, ha azt szeretn�d, hogy a bash ki is �rt�kelje a sz�mokat? A megold�s a k�vetkez�:
echo $((1+1))
Ez m�r sokkal logikusabb kimenetet ad. �gy kell egy aritmetikai kifejez�st ki�rt�kelni. Ugyanezt az eredm�nyt kapod a k�vetkez�vel:
echo $[1+1]
Ha t�rtekre vagy m�s matematikai jelleg� dolgokra van sz�ks�ged, vagy egyszer�en csak ezt szeretn�d haszn�lni, akkor bc-vel is ki�rt�kelheted az aritmetikai kifejez�seket.
Ha be�rom a parancssorba, hogy "echo $[3/4]", akkor 0-t kapok, mivel a bash csak eg�szekkel dolgozik. Az "echo 3/4|bc -l" parancsra viszont m�r helyes eredm�nyt ad, azaz 0.75-�t.
Mike levele nyom�n (n�zd meg a k�sz�netnyilv�n�t�st):
Eddig mindig a "#!/bin/bash" form�t haszn�ltuk, most itt van p�r p�lda arra, hogyan tudhatod meg a bash konkr�t el�r�si �tj�t.
A "locate bash" az egyik legjobb m�dszer erre a feladatra, de nem minden rendszeren van locate.
A gy�k�rb�l kiadott "find ./ -name bash" legt�bbsz�r m�k�dik.
A lehets�ges helyek, ahol n�zel�dhetsz:
ls -l /bin/bash
ls -l /sbin/bash
ls -l /usr/local/bin/bash
ls -l /usr/bin/bash
ls -l /usr/sbin/bash
ls -l /usr/local/sbin/bash
(Most kap�sb�l nem jut t�bb eszembe... A legt�bb rendszeren
ezen k�nyvt�rak valamelyik�ben lesz).
Vagy megpr�b�lhatod a "which bash" parancsot is.
Bash-ban a programok visszat�r�si �rt�ke egy speci�lis v�ltoz�ban t�rol�dik, melynek neve $?.
A k�vetkez� p�lda bemutatja, hogyan der�thetj�k ki egy program visszat�r�si �rt�k�t. Felt�telezem, hogy a dada nev� k�nyvt�r nem l�tezik. (Ez szint�n Mike javaslat�ra ker�lt ide.)
#!/bin/bash
cd /dada &> /dev/null
echo rv: $?
cd $(pwd) &> /dev/null
echo rv: $?
A k�vetkez� szkript list�zza az �sszes t�bl�t az �sszes adatb�zisb�l (felteszem, hogy MySQL-t haszn�lsz). Megv�ltoztathatod a "mysql" parancsot �gy, hogy val�di felhaszn�l�nevet �s jelsz�t haszn�lsz.
#!/bin/bash
DBS=`mysql -uroot -e"show databases"`
for b in $DBS ;
do
mysql -uroot -e"show tables from $b"
done
A "source" parancs seg�ts�g�vel t�bb f�jlt is haszn�lhatsz egyszerre.
__TO-DO__
(1) s1 = s2
(2) s1 != s2
(3) s1 < s2
(4) s1 > s2
(5) -n s1
(6) -z s1
(1) s1 megegyezik s2-vel
(2) s1 nem egyezik meg s2-vel
(3) __TO-DO__
(4) __TO-DO__
(5) s1 nem nulla (egy vagy t�bb karakterb�l �ll)
(6) s1 nulla
K�t sztring �sszehasonl�t�sa.
#!/bin/bash
S1='string'
S2='String'
if [ $S1=$S2 ];
then
echo "S1('$S1') nem egyenl� S2('$S2')-vel"
fi
if [ $S1=$S1 ];
then
echo "S1('$S1') egyenl� S1('$S1')-vel"
fi
Most id�zek egy r�szt Andreas Beck level�b�l, az if [ $1 = $2 ] alak� utas�t�sokkal kapcsolatban.
Nem t�l j� �tlet a fenti p�ld�ban is l�that� m�dszert haszn�lni, mert ha a $S1 vagy a $S2 �res, �rtelmez�si hib�t kapunk. Helyette haszn�ljuk ink�bb az x$1=x$2 vagy a "$1"="$2" form�t.
+
-
*
/
% (marad�k)
-lt (<)
-gt (>)
-le (<=)
-ge (>=)
-eq (==)
-ne (!=)
A C programoz�k egyszer�en �ssze tudj�k vetni ezen oper�torokat a z�r�jelek k�zt megadottakkal.
Ezt a r�szt Kees �jra�rta (n�zd meg a k�sz�netnyilv�n�t�st...).
N�h�ny ezek k�z�l a programok k�z�l egy komplett programoz�si nyelvet takar. Ezen parancsok eset�n csak az alapokat ismertetj�k. Ha r�szletes le�r�sra is sz�ks�ged van n�zd meg a parancsok k�zik�nyv oldalait (man pages).
sed (folyam szerkeszt�)
A sed egy nem interakt�v szerkeszt�program. Ez azt jelenti, hogy a f�jlok m�dos�t�sa nem �gy megy, hogy mozgatod a kurzort a k�perny�n. Itt szerkeszt� utas�t�sokb�l �ll� szkripteket haszn�lunk �s egy f�jlnevet, amit szerkeszteni akarunk. A sed tulajdonk�ppen egy sz�r�nek is felfoghat�. N�zz�k az al�bbi p�ld�kat:
$sed 's/mit_cser�ljek/mire_cser�ljem/g' /tmp/dummy
A sed kicser�li a "mit_cser�ljek" sz�veget a "mire_cser�ljem" sz�veggel, �s a bemenet�t a /tmp/dummy f�jlb�l veszi. A v�geredm�ny az stdout-ra lesz k�ldve (ami alapesetben a konzol), de ha a sor v�g�hez �rod, hogy "> f�jln�v", akkor a sed kimenet�t a "f�jln�v" nev� f�jlba k�ldi.
$sed 12, 18d /tmp/dummy
A sed, a 12. �s 18. sorok k�zti r�sz kiv�tel�vel ki�rja a f�jl tartalm�t. Az eredeti f�jl nem v�ltozik.
awk (f�jlok m�dos�t�sa, sz�veg kinyer�se �s szerkeszt�se)
Az AWK-nak sz�mos implement�ci�ja l�tezik (a legismertebbek a GNU-s gawk �s az �n. "�j awk", a mawk). Az alapelv egyszer�: az AWK mint�t keres �s minden illeszked� mint�ra v�grehajt valamilyen m�veletet.
Megint l�trehoztam egy dummy nev� f�jlt, ami a k�vetkez� sorokb�l �ll:
"test123
test
tteesstt"
$awk '/test/ {print}' /tmp/dummy
test123
test
A minta, amit az AWK keres, a "test". Ha a /tmp/dummy f�jlban tal�lt egy sort, amiben szerepelt a "test" sz�, akkor v�grehajtotta r� a "print" m�veletet.
$awk '/test/ {i=i+1} END {print i}' /tmp/dummy
3
Ha sokf�le mint�ra keresel, cser�ld ki az id�z�jelek k�zti sz�veget "-f file.awk"-ra �s a mint�kat, v�grehajtand� tev�kenys�geket �rd a "file.awk" nev� f�jlba.
grep (a keres�si mint�ra illeszked� sorok ki�r�sa)
Az el�z� fejezetekben m�r j� n�h�ny grep parancsot l�ttunk, amelyek az illeszked� sorokat �rt�k ki. De a grep t�bbre is k�pes.
$grep "ezt keress�k" /var/log/messages -c
12
Az "ezt keress�k" sz�veg 12-szer szerepelt a /var/log/messages nev� f�jlban.
[J�, ez csak egy kital�lt p�lda, a /var/log/messages meg lett buher�lva. :-)]
wc (sorok, szavak, b�jtok megsz�mol�sa)
A k�vetkez� p�ld�ban m�st kapunk, mint amit v�runk. A dummy nev� f�jl, amit most haszn�lunk, a k�vetkez� sz�veget tartalmazza: "bash bevezet�s HOWTO teszt f�jl"
$wc --words --lines --bytes /tmp/dummy
2 5 34 /tmp/dummy
A wc nem foglalkozik a param�terek sorrendj�vel. Mindig egy el�re megadott sorrendben �rja ki �ket, amint azt te is l�thatod: (sorok)(szavak)(b�jtok)(f�jln�v).
sort (sz�veges f�jl sorainak rendez�se)
Most a dummy f�jl a k�vetkez�ket tartalmazza:
"b
c
a"
$sort /tmp/dummy
A kimenet k�b� �gy n�z ki:
a
b
c
A parancsok nem lehetnek ilyen egyszer�ek :-)
bc (egy sz�mol�g�pes programoz�si nyelv)
A bc a parancssorb�l kapja meg a sz�m�t�si feladatokat (f�jlb�l, nem pedig �tir�ny�t�s vagy cs� �tj�n), esetleg egy felhaszn�l�i fel�letr�l. A k�vetkez�kben p�ld�kon kereszt�l bemutatunk n�h�ny parancsot.
A bc-t a -q param�terrel ind�tom, hogy ne �rja ki az �dv�zl� sz�veget.
$bc -q
1 == 5
0
0.05 == 0.05
1
5 != 5
0
2 ^ 8
256
sqrt(9)
3
while (i != 9) {
i = i + 1;
print i
}
123456789
quit
tput (termin�l inicializ�l�s�ra vagy a terminfo adatb�zis lek�rdez�s�re)
Egy kis p�lda a tput k�pess�geinek demonstr�l�s�ra:
$tput cup 10 4
A kurzor a (y10,x4)-es poz�ci�ban jelenik meg.
$tput reset
T�rli a k�perny�t, �s a kurzor az (y1,x1) poz�ci�ba ker�l. Az (y0,x0) a bal fels� sarok koordin�t�ja.
$tput cols
80
Az x tengely ir�ny�ban maxim�lisan elhelyezhet� karakterek sz�ma.
Nagyon aj�nlott, hogy legal�bb ezen programok haszn�lat�val tiszt�ban legy�l. Milli� olyan kis program van, amikkel csod�kra lehetsz k�pes a parancssorban.
[N�h�ny p�lda k�zik�nyv oldalb�l vagy GYIK-b�l sz�rmazik.]
#!/bin/bash
SRCD="/home/"
TGTD="/var/backups/"
OF=home-$(date +%Y%m%d).tgz
tar -cZf $TGTD$OF $SRCD
#!/bin/sh
# renna: egyszerre t�bb f�jl �tnevez�se k�l�nb�z� szab�lyok szerint
# �rta: Felix Hudson (2000. janu�r)
# el�sz�r is megn�zz�k, hogy a program milyen "�zemm�dban" van
# ha az els� param�ter ($1) alapj�n valamelyik felt�tel teljes�l v�grehajtjuk
# a hozz� tartoz� programr�szt �s kil�p�nk
# el�tag (prefix) szerint t�rt�n� �tnevez�s?
if [ $1 = p ]; then
# most megszabadulunk a m�dot tartalmaz� v�ltoz�t�l ($1) �s a prefixt�l ($2)
prefix=$2 ; shift ; shift
# megn�zz�k, adtak-e meg f�jlnevet
# ha nem, jobb ha nem csin�lunk semmit, minthogy neml�tez� f�jlokat
# nevezz�nk �t
if [$1 = ]; then
echo "nem adt�l meg f�jlnevet"
exit 0
fi
# ez a for ciklus v�gigmegy a megadott f�jlokon �s mindet
# egyenk�nt �tnevezi
for file in $*
do
mv ${file} $prefix$file
done
# kil�p�nk a programb�l
exit 0
fi
# ut�tag (suffix) szerinti �tnevez�s?
# az ide tartoz� r�sz tulajdonk�ppen megegyezik az el�z�vel
# n�zd meg az ottani megjegyz�seket
if [ $1 = s ]; then
suffix=$2 ; shift ; shift
if [$1 = ]; then
echo "nem adt�l meg f�jlnevet"
exit 0
fi
for file in $*
do
mv ${file} $file$suffix
done
exit 0
fi
# helyettes�t�ses �tnevez�s?
if [ $1 = r ]; then
shift
# ezt a r�szt az�rt raktam bele, hogy ne tegy�k t�nkre a felhaszn�l� egyik
# �llom�ny�t se, ha helytelenek a param�terek
# ez csak egy biztons�gi int�zked�s
if [ $# -lt 3 ] ; then
echo "haszn�lat: renna r [kifejez�s] [helyettes�t�s] f�jlok... "
exit 0
fi
# tov�bbl�p�nk a param�terlist�n
OLD=$1 ; NEW=$2 ; shift ; shift
# Ez a for ciklus v�gigmegy az �sszes f�jlon amit a programnak �tadtak,
# �s egyenk�nt �tnevezi �ket a "sed" program seg�ts�g�vel.
# A "sed" egyszer� parancssori program, ami �rtelmezi a bemenetet �s
# kicser�li a be�ll�tott kifejez�st egy adott sz�vegre.
# Mi itt a f�jl nev�t adjuk �t neki (standard bemenetk�nt), �s kicser�lj�k
# benne a kifejez�snek megfelel� sz�vegr�szeket.
for file in $*
do
new=`echo ${file} | sed s/${OLD}/${NEW}/g`
mv ${file} $new
done
exit 0
fi
# Ha id�ig eljutottunk, akkor semmi haszn�lhat�t nem adtak �t a programnak
# ez�rt ki�rjuk a felhaszn�l�nak, hogyan haszn�lja ezt a szkriptet.
echo "haszn�lat:"
echo " renna p [el�tag] f�jlok.."
echo " renna s [ut�tag] f�jlok.."
echo " renna r [kifejez�s] [helyettes�t�s] f�jlok.."
exit 0
#ennyi!
#!/bin/bash
# renames.sh
# egyszer� �tnevez� program
criteria=$1
re_match=$2
replace=$3
for i in $( ls *$criteria* );
do
src=$i
tgt=$(echo $i | sed -e "s/$re_match/$replace/")
mv $src $tgt
done
J� dolog, ha az els� sorban a k�vetkez� szerepel:
#!/bin/bash -x
Ennek hat�s�ra �rdekes kimeneti inform�ci�kat kaphatunk.
Szabadon k�ldhetsz javaslatokat/hibajav�t�sokat vagy b�rmi olyat, amir�l �gy gondolod, hogy �rdekes �s sz�vesen l�tn�d a dokumentumban. Megpr�b�lom majd olyan gyakran friss�teni a le�r�st, amilyen gyorsan csak tudom.
A dokumentummal kapcsolatban semmif�le garancia nincs.
Olasz: by William Ghelfi (wizzy at tiscalinet.it) itt a c�m
Francia: by Laurent Martelli nincs c�m
Koreai: Minseok Park http://kldp.org
Koreai: Chun Hye Jin ismeretlen
Spanyol: ismeretlen http://www.insflug.org
Lehet, hogy t�bb ford�t�s is van, de �n nem tudok r�la. Ha neked ilyen van, k�rlek k�ldd el, hogy friss�thessem ezt a r�szt.
�j ford�t�sok �s l�nyegi jav�t�sok.
A Kess �ltal �t�rt hasznos parancsok r�sz hozz�ad�sa.
Hibajav�t�sok, javaslatok.
P�ld�k a sztring �sszehasonl�t�shoz.
v0.8 Elhagyom a verzi�sz�moz�st, r�j�ttem, hogy a d�tum is el�g.
v0.7 Sz�mos hibajav�t�s �s p�r r�gi TO-DO r�sz meg�r�sa.
v0.6 Kisebb jav�t�sok.
v0.5 Az �tir�ny�t�ssal foglalkoz� r�sz hozz�ad�sa.
v0.4 A volt f�n�k�mnek k�sz�nhet�en a doksi elt�nt a r�gi hely�r�l, most a www.linuxdoc.org c�men �rhet� el.
el�tte: Nem eml�kszem, nem haszn�ltam se rcs-t, se cvs-t. :(
Bevezet�s a bash programoz�sba (BE alatt) http://org.laol.net/lamug/beforever/bashtut.htm
Bourne shell programoz�s http://207.213.123.70/book/
(Ezeket a forr�sokat a lektor gy�jt�tte �ssze.)
B�ki Andr�s: "UNIX/Linux h�jprogramoz�s" (ISBN: 963 9301 10 8)
Bourne shell programoz�s http://www.inf.u-szeged.hu/~bmse/unix/unix3.html
Shell programoz�s http://shell-script-programing.sync.hu/SHELL_PROGRAMOZAS.htm
Shell programoz�s http://www.fsz.bme.hu/~szebi/slides/U3/sld010.htm
Shell programoz�s http://www.szabilinux.hu/ufi/10.html