Bevezet�s a bash programoz�sba HOGYAN

Mike G mikkey at dynamo.com.ar

2000. j�lius 27.
Ezen dokumentum c�lja, hogy bevezessen az alap- illetve k�z�pszint� shell szkript �r�sba. A dokumentum nem egy minden r�szletre kiterjed� le�r�s (ez a c�m�b�l is kit�nik). �n nem vagyok se profi shell programoz�, se guru. Az�rt d�nt�ttem �gy, hogy meg�rom ezt a HOGYANt, mert sokat tanulhatok bel�le �s tal�n m�soknak is haszn�ra v�lhat. Minden visszajelz�s�rt h�l�s vagyok, k�l�n�sk�ppen, ha folt (patch) form�j�ban k�ld�d el. :)

1. Bevezet�s

1.1 A dokumentum leg�jabb v�ltozata

A dokumentum leg�jabb v�ltozata megtal�lhat� a http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html honlapon

1.2 Sz�ks�ges alapok

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.

1.3 A dokumentum haszn�lata

Ez a dokumentum a k�vetkez� esetekben lehet hasznos:

1.4 Magyar ford�t�s

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.

2. Egyszer� szkriptek

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.

2.1 A szok�sos hello world szkript

          #!/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.

2.2 Egy nagyon egyszer� backup szkript

        #!/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.

3. Az �tir�ny�t�sr�l

3.1 Elm�let �s gyors �tbaigaz�t�s

H�rom f�jlle�r� van: stdin, stdout �s stderr (std=standard).

Alapvet�en a k�vetkez�k tehet�k meg:

  1. stdout f�jlba ir�ny�t�sa
  2. stderr f�jlba ir�ny�t�sa
  3. stdout stderr-be ir�ny�t�sa
  4. stderr stdout-ba ir�ny�t�sa
  5. stderr �s stdout f�jlba ir�ny�t�sa
  6. stderr �s stdout stdout-ba ir�ny�t�sa
  7. stderr �s stdout stderr-be ir�ny�t�sa
Az 1 az stdout, a 2 az stderr (a 0 pedig az stdin - a ford.).

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.

3.2 P�lda: az stdout f�jlba ir�ny�t�sa

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.

3.3 P�lda: az stderr f�jlba ir�ny�t�sa

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.

3.4 P�lda: az stdout stderr-be t�rt�n� ir�ny�t�sa

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.

3.5 P�lda: az stderr stdout-ba t�rt�n� ir�ny�t�sa

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).

3.6 P�lda: az stderr �s stdout f�jlba ir�ny�t�sa

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.

4. Cs�vek (pipe)

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.

4.1 A cs�vek �s azok haszn�lata

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.

4.2 P�lda: cs�vek �s a sed

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.

4.3 P�lda: az ls -l *.txt parancs m�sk�nt

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.

5. V�ltoz�k

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.

5.1 P�lda: Hello World! v�ltoz�kkal

            #!/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.

5.2 P�lda: Egyszer� backup szkript (kicsivel jobb v�ltozat)

           #!/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)

5.3 Lok�lis v�ltoz�k

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.

6. Felt�teles utas�t�sok

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.

6.1 Elm�let

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

6.2 P�lda: alapvet� felt�teles utas�t�s (if ... then)

            #!/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.

6.3 P�lda: alapvet� felt�teles utas�t�s (if ... then ... else)

            #!/bin/bash
            if [ "foo" = "foo" ]; then
               echo a felt�tel igaz
            else
               echo a felt�tel hamis
            fi
            

6.4 P�lda: V�ltoz�k �s felt�teles utas�t�sok

            #!/bin/bash
            T1="foo"
            T2="bar"
            if [ "$T1" = "$T2" ]; then
                echo a felt�tel igaz
            else
                echo a felt�tel hamis
            fi
            

7. Ciklusok (for, while �s until)

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.

7.1 P�lda for ciklusra

        #!/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.

7.2 C-szer� for ciklus

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
        

7.3 While p�lda

         #!/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.).

7.4 Until p�lda

         #!/bin/bash
         COUNTER=20
         until [  $COUNTER -lt 10 ]; do
             echo COUNTER $COUNTER
             let COUNTER-=1
         done
         

8. F�ggv�nyek

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.

8.1 P�lda f�ggv�nyekre

           #!/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).

8.2 P�lda param�teres f�ggv�nyekre

                #!/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.

9. Felhaszn�l�i fel�letek

9.1 Egyszer� men� a "select" haszn�lat�val

           #!/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.

9.2 A parancssor haszn�lata

          #!/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.

10. Egyebek

10.1 Adatok bek�r�se felhaszn�l�t�l: read

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 !"
        

10.2 Aritmetikai kifejez�sek ki�rt�kel�se

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.

10.3 A bash felkutat�sa

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.

10.4 Program visszat�r�si �rt�k�nek kider�t�se

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: $?
        

10.5 Parancs kimenet�nek t�rol�sa

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
        

10.6 T�bb forr�sf�jl haszn�lata

A "source" parancs seg�ts�g�vel t�bb f�jlt is haszn�lhatsz egyszerre.

__TO-DO__

11. T�bl�zatok

11.1 Sztring �sszehasonl�t� oper�torok

(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

11.2 P�ld�k sztingek �sszehasonl�t�s�ra

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.

11.3 Aritmetikai oper�torok

+

-

*

/

% (marad�k)

11.4 Aritmetikai rel�ci�s oper�torok

-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.

11.5 Hasznos parancsok

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.]

12. M�g n�h�ny szkript

12.1 Parancs v�grehajt�sa a k�nyvt�rban l�v� �sszes f�jlra

12.2 P�lda: egyszer� backup szkript (egy kicsivel jobb verzi�)

            #!/bin/bash
            SRCD="/home/"
            TGTD="/var/backups/"
            OF=home-$(date +%Y%m%d).tgz
            tar -cZf $TGTD$OF $SRCD
           

12.3 F�jl �tnevez� program


             #!/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!
             
          

12.4 �tnevez� program (egyszer� v�ltozat)

     #!/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
     

13. Ha gond van... (hibakeres�s)

13.1 A bash megh�v�s�nak m�djai

J� dolog, ha az els� sorban a k�vetkez� szerepel:

          #!/bin/bash -x
          

Ennek hat�s�ra �rdekes kimeneti inform�ci�kat kaphatunk.

14. A dokumentumr�l

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.

14.1 (nincs) garancia

A dokumentummal kapcsolatban semmif�le garancia nincs.

14.2 Ford�t�sok

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.

14.3 K�sz�net

14.4 T�rt�net

�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. :(

14.5 Tov�bbi forr�sok

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/

14.6 Tov�bbi forr�sok magyarul

(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