
                     Bevezets a bash programozsba HOGYAN

Mike G mikkey at dynamo.com.ar

   2000. jlius 27.
     _________________________________________________________________

   Ezen dokumentum clja, hogy bevezessen az alap- illetve kzpszint
   shell szkript rsba. A dokumentum nem egy minden rszletre kiterjed
   lers (ez a cmbl is kitnik). n nem vagyok se profi shell
   programoz, se guru. Azrt dntttem gy, hogy megrom ezt a HOGYANt,
   mert sokat tanulhatok belle s taln msoknak is hasznra vlhat.
   Minden visszajelzsrt hls vagyok, klnskppen, ha folt (patch)
   formjban kldd el. :) 
     _________________________________________________________________

1. Bevezets

1.1 A dokumentum legjabb vltozata

   A dokumentum legjabb vltozata megtallhat a
   [1]http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html honlapon

1.2 Szksges alapok

   Jl jhet, ha ismered a GNU/Linux rendszerek parancssort, s hasznos,
   ha tisztban vagy az alapvet programozsi elvekkel. Noha ez nem egy
   programozsba bevezet lers, sok ilyet is megprblok majd
   bemutatni.

1.3 A dokumentum hasznlata

   Ez a dokumentum a kvetkez esetekben lehet hasznos:
     * Mr tudsz valamennyire programozni, s szeretnl vgre shell
       szkripteket rni.
     * Van valami halvny fogalmad a shell programozsrl, s szeretnl
       tbbet megtudni rla.
     * Ltni akarsz pr shell szkriptet s nmi magyarzatot, hogy
       hozzlthass sajtod megrshoz.
     * DOS/Windows rendszerrl jssz/jttl s "batch" programokat
       akarsz rni.
     * Annyira pedl vagy, hogy mr minden ltez HOGYANt elolvastl.

1.4 Magyar fordts

   A magyar fordtst [2]Kovcs Ferenc ksztette (2004.06.18). A
   lektorlst [3]Daczi Lszl vgezte el (2004.06.20). A dokumentum
   legfrissebb vltozata megtallhat a [4]Magyar Linux Dokumentcis
   Projekt honlapjn. A dokumentum fordtsa a [5]Szegedi Tudomnyegyetem
   [6]nylt forrskd szoftverfejleszts specilkollgiumnak
   segtsgvel valsult meg.

2. Egyszer szkriptek

   Ez a HOGYAN megprbl tmutatknt szolglni a shell szkriptek
   megismershez. A tmt gyakorlati oldalrl, pldkon keresztl
   kzeltjk meg.

   Az ebben a rszben tallhat nhny plda remlhetleg segt majd
   megrteni pr alapvet mdszert.

2.1 A szoksos hello world szkript

          #!/bin/bash
          echo Hello World

   A szkript csak kt sorbl ll. Az elsben jelezzk a rendszernek,
   hogy melyik programot hasznlja a szkript futtatshoz.

   A msodikban pedig kirjuk a "Hello World" szveget a terminlra.

   Ha a kpernyn a ./hello.sh: Command not found. vagy ehhez hasonl
   zenet jelenik meg, akkor valsznleg az els sorban lv
   "#!/bin/bash" lesz a ludas. A hiba javtshoz mdostsd az els sort
   gy, hogy az a bash tnyleges elrsi tvonalt tartalmazza. Az
   tvonal lekrsre hasznlhat a "whereis bash" parancs, vagy olvasd
   el "A bash felkutatsa" cm fejezetet.

2.2 Egy nagyon egyszer backup szkript

        #!/bin/bash
        tar -cZf /var/my-backup.tgz /home/me/

   Ebben a szkriptben, az elztl eltren, nem szveget jelentnk
   meg a kpernyn, hanem a felhasznl "home" knyvtrban lv
   fjlokat sszefzzk egyetlen tar fjlba. Ez csak a plda kedvrt
   szerepel most itt, ksbb egy sokkal hasznlhatbb backup szkriptet
   is bemutatunk.

3. Az tirnytsrl

3.1 Elmlet s gyors tbaigazts

   Hrom fjller van: stdin, stdout s stderr (std=standard).

   Alapveten a kvetkezk tehetk meg:
    1. stdout fjlba irnytsa
    2. stderr fjlba irnytsa
    3. stdout stderr-be irnytsa
    4. stderr stdout-ba irnytsa
    5. stderr s stdout fjlba irnytsa
    6. stderr s stdout stdout-ba irnytsa
    7. stderr s stdout stderr-be irnytsa

   Az 1 az stdout, a 2 az stderr (a 0 pedig az stdin - a ford.).

   Egy kis magyarzat, hogyan is kell mindezt rteni: a less paranccsal
   meg tudod nzni mind az stdout "tartalmt" (ami a bufferen marad),
   mind az stderr-t, ami a kpernyn jelenik meg, de trldik, amint
   olvasni prblod a buffert.

3.2 Plda: az stdout fjlba irnytsa

   Ennek hatsra a program kimenete fjlba rdik.

        ls -l > ls-l.txt

   Itt ltrejn az "ls-l.txt" nev fjl, melynek tartalma meg fog
   egyezni azzal, amit az "ls -l" parancs futtatsakor a kpernyn
   ltnl.

3.3 Plda: az stderr fjlba irnytsa

   Hatsra a program stderr kimenete fjlba rdik.

        grep da * 2> grep-errors.txt

   Itt is ltrejn a "grep-errors.txt" nev fjl, melynek tartalma a
   "grep da *" parancs stderr kimenetvel fog megegyezni.

3.4 Plda: az stdout stderr-be trtn irnytsa

   Ennek hatsra a program stderr kimenetre lesznek rva az stdout-ra
   kldtt adatok is.

        grep da * 1>&2

   Itt a parancs stdout kimenete az stderr-re lesz elkldve, ahogy ezt
   mr bizonyra szrevetted.

3.5 Plda: az stderr stdout-ba trtn irnytsa

   Most a program stderr kimenete az stdout-nak megfelel fjllerba
   lesz rva.

        grep * 2>&1

   Itt az stderr-ra kldtt adatok is az stdout-on jelennek meg. Ha ezt
   egy csvel (pipe) sszektd a less programmal lthatod, hogy azok a
   sorok, amik normlis esetben eltnnnek (mivel az stderr-ra rtuk
   ket), most megmaradnak (hiszen az stdout-ra lettek irnytva).

3.6 Plda: az stderr s stdout fjlba irnytsa

   Ebben az esetben a program minden kimenete fjlba kerl. Ez nha
   hasznos lehet pldul a cron bejegyzsek esetn, ha egy programot
   teljes csndben akarsz futtatni.

        rm -f $(find / -name core) &> /dev/null

   Ez (gondolva itt a cron bejegyzsekre) minden knyvtrbl kitrli a
   "core" nev fjlokat. Fontos tisztban lenned azzal, hogy egy program
   pontosan mit is csinl, mieltt "megsznteted" a kimenett.

4. Csvek (pipe)

   Ebben a fejezetben a csvek hasznlatnak egy egyszer s hasznos
   mdjt ismertetjk, valamint elmondjuk hol lehet szksged rjuk.

4.1 A csvek s azok hasznlata

   A csvek olyan egyszer eszkzk, melyek lehetv teszik, hogy egy
   program bemenett egy msik program kimenetrl vegye.

4.2 Plda: csvek s a sed

   Ez a csvek hasznlatnak egy nagyon egyszer mdja.

        ls -l | sed -e "s/[aeio]/u/g"

   Itt a kvetkez trtnik: elszr az ls -l parancs vgrehajtdik, de
   a kimenete nem lesz kirva a kpernyre, hanem el lesz kldve a sed
   programnak, ami ezt bemenetknt rtelmezi s ebbl ellltja sajt
   kimenett.

4.3 Plda: az ls -l *.txt parancs msknt

   A kvetkez parancs minden bizonnyal sokkal bonyolultabb, mint a
   szoksos ls -l *.txt, de a csvek tulajdonsgainak illusztrlsra j
   plda. A gyakorlatban ilyen listzsi problmk megoldsra lehetleg
   ne hasznljunk csveket.

        ls -l | grep "\.txt$"

   Itt az ls -l program kimenete el lesz kldve a grep programnak, ami
   kirja azokat a sorokat, melyek illeszkednek a "\.txt$" regulris
   kifejezsre.

5. Vltozk

   Ugyangy hasznlhatsz vltozkat, mint brmely ms programozsi
   nyelvben. Adattpusok nincsenek. Egy bash vltoz trolhat szmot,
   karaktert s karakterekbl ll sztringet.

   A vltozkat nem kell kln deklarlni, a rjuk val hivatkozskor
   automatikusan ltrejnnek.

5.1 Plda: Hello World! vltozkkal

            #!/bin/bash
            STR="Hello World!"
            echo $STR

   A msodik sorban ltrejn egy STR nev vltoz, melynek rtke a
   "Hello World!" (sztring) lesz. Ezutn a vltoz neve el tett "$"
   jellel tudjuk elrni annak rtkt. Jegyezd meg (s prbld is ki),
   hogy ha nem hasznlod a "$" jelet, a program kimenete ms lesz s
   valsznleg nem az, amit szeretnl.

5.2 Plda: Egyszer backup szkript (kicsivel jobb vltozat)

           #!/bin/bash
           OF=/var/my-backup-$(date +%Y%m%d).tgz
           tar -cZf $OF /home/me/

   Ez a szkript felvet egy msik dolgot is. De mindenek eltt tisztban
   kell lenned a vltozk ltrehozsval, az rtkadssal kapcsolatos
   dolgokkal (ez a msodik sorban lthat). Most vegyk szemgyre a
   "$(date +%Y%m%d)" kifejezst. Ha futtatod a szkriptet a zrjelek
   kzti parancs is lefut, ltrehozva kimenett.

   Azt is vegyk szre, hogy a kimeneti fjl neve minden nap ms s ms
   lesz, a date parancs formtum-kapcsolinak (+%Y%m%d) ksznheten.
   Ezt mdosthatod ms formtum megadsval.

   Mg nhny plda:

   echo ls

   echo $(ls)

5.3 Loklis vltozk

   Loklis vltozkat a local kulcsszval tudunk ltrehozni.

                #!/bin/bash
                HELLO=Hello
                function hello {
                        local HELLO=World
                        echo $HELLO
                }
                echo $HELLO
                hello
                echo $HELLO

   Ennek a pldnak elgnek kell lennie, hogy bemutassa a loklis
   vltozk hasznlatt.

6. Feltteles utastsok

   A feltteles utastsok segtsgvel dnthetnk, hogy vgrehajtunk-e
   valamit vagy nem. A dnts itt egy kifejezs kirtkelsbl ll.

6.1 Elmlet

   A feltteles utastsoknak tbb formja is van. A legalapvetbb a
   kvetkez: if kifejezs then utasts, ahol az "utasts" csak akkor
   kerl vgrehajtsra, ha a kifejezs, kirtkelse utn igazat ad
   vissza. Pldul a "2<1" kifejezs kirtkels utni rtke hamis, mg
   a "2>1" esetn igaz.

   A msik eset: if kifejezs then utasts1 else utasts2. Az
   "utasts1" akkor hajtdik vgre, ha a kifejezs igaz, egyb esetben
   az "utasts2" kerl vgrehajtsra.

   A feltteles utasts egy msik formja: if kifejezs1 then utasts1
   else if kifejezs2 then utasts2 else utasts3. Ebben az esetben
   csak az "ELSE IF 'kifejezs2' THEN 'utasts2'" rszt adtuk hozz, gy
   az utasts2 akkor lesz vgrehajtva, ha a kifejezs2 kirtkels utni
   rtke igaz. A tbbit mr magad is el tudod kpzelni (nzd meg az
   elz formkat).

   Pr sz a szintaxisrl:

   Bash-ban az "if" szerkezetek a kvetkezkpp nznek ki:

   if [kifejezs];

   then

   a "kifejezs" igaz volta esetn vgrehajtd kd

   fi

6.2 Plda: alapvet feltteles utasts (if ... then)

            #!/bin/bash
            if [ "fo = "fo ]; then
               echo a felttel igaz
            fi

   A szgletes zrjelbe tett kifejezs igaz rtke esetn vgrehajtd
   kd a "then" kulcssz utn s a "fi" kulcssz eltt helyezkedik el. A
   "fi" kulcssz jelzi a felttelesen vgrehajtand kd vgt.

6.3 Plda: alapvet feltteles utasts (if ... then ... else)

            #!/bin/bash
            if [ "fo = "fo ]; then
               echo a felttel igaz
            else
               echo a felttel hamis
            fi

6.4 Plda: Vltozk s feltteles utastsok

            #!/bin/bash
            T1="fo
            T2="bar"
            if [ "$T1" = "$T2" ]; then
                echo a felttel igaz
            else
                echo a felttel hamis
            fi

7. Ciklusok (for, while s until)

   Ebben a rszben a for, while s until ciklusokrl lesz sz.

   A for ciklus egy kicsit eltr a ms nyelvekben megszokottaktl.
   Alapveten egy sztringekben szerepl szavak halmaznak
   feldolgozsra hasznljuk.

   A while ciklus addig ismtli a ciklusmagot, amg a ciklusfelttel
   hamiss nem vlik (vagy ki nem ugrunk a ciklusmagbl a break
   utastssal).

   Az until ciklus tulajdonkppen azonos a while ciklussal, a klnbsg
   csupn annyi, hogy az ismtls addig folytatdik, amg a felttel
   hamis.

   Ha gyans volt szmodra, hogy a while s az until ciklusok mennyire
   hasonlk, akkor igazad volt.

7.1 Plda for ciklusra

        #!/bin/bash
        for i in $( ls ); do
            echo elem: $i
        done

   A msodik sorban deklarltunk egy "i" nev vltozt, ami majd sorra
   felveszi a $( ls ) sztring klnbz rtkeit.

   A harmadik sor szksg esetn mretesebb is lehet, vagy tbb sor is
   szerepelhet a ciklusmagban a done (4. sor) kulcssz eltt.

   A "done" (4. sor) jelzi, hogy a $i rtket hasznl kdrszlet
   befejezdtt. Innentl kezdve a $i j rtket vehet fel.

   Ennek a szkriptnek gy nem sok rtelme van. A for ciklus hasznlatnak
   egy sokkal hasznosabb mdja, ha az elz pldnl csak bizonyos
   fjlokat vizsglunk.

7.2 C-szer for ciklus

   Fiesh tancsra kerlt ide ez a plda, ami egy C/Perl-szer for
   ciklust mutat be.

        #!/bin/bash
        for i in `seq 1 10`;
        do
                echo $i
        done

7.3 While plda

         #!/bin/bash
         COUNTER=0
         while [  $COUNTER -lt 10 ]; do
             echo A szmll rtke: $COUNTER
             let COUNTER=COUNTER+1
         done

   Ez a szkript a jl ismert "for" ciklust utnozza (C, Pascal, perl,
   stb.).

7.4 Until plda

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

8. Fggvnyek

   Mint a legtbb programozsi nyelvben itt is hasznlhatunk fggvnyeket
   a kd logikailag sszetartoz rszeinek csoportostsra, vagy ha csak
   ldozni szeretnnk a rekurzi virtulis oltra eltt (azaz ha
   rekurzv fggvnyeket akarunk rni).

   A fggvnydeklarci csupn ennyibl ll: function my_func { my_code
   }.

   A fggvny hvsa pedig ugyangy trtnik, mint brmelyik program
   esetn, csak lerjuk a nevt.

8.1 Plda fggvnyekre

           #!/bin/bash
           function quit {
               exit
           }
           function hello {
               echo Hello!
           }
           hello
           quit
           echo foo

   A 2-4 sorok tartalmazzk a "quit", az 5-7 sorok pedig a "hell
   fggvnyt. Ha nem teljesen vilgos szmodra, hogy mit is csinl a
   szkript, prbld ki!

   Megjegyzend, hogy a fggvnydeklarci sorrendje tetszleges.

   Amikor lefuttatjuk a szkriptet ltjuk, hogy elszr a "hell, majd a
   "quit" fggvnyek hvdnak meg s a program sohasem ri el a 10. sort
   (echo foo).

8.2 Plda paramteres fggvnyekre

                #!/bin/bash
                function quit {
                   exit
                }
                function e {
                    echo $1
                }
                e Hello
                e World
                quit
                echo foo


   Ez a szkript nagyrszt megegyezik az elzvel. A f klnbsg az
   "e" nev fggvnyben rejlik, ami nem csinl mst, mint kirja az
   els tvett argumentumot. A fggvnyeknl szerepl argumentumok
   ugyangy kezelhetk, mint a szkriptnek tadott argumentumok.

9. Felhasznli felletek

9.1 Egyszer men a "select" hasznlatval

           #!/bin/bash
           OPTIONS="Hello Quit"
           select opt in $OPTIONS; do
               if [ "$opt" = "Quit" ]; then
                echo done
                exit
               elif [ "$opt" = "Hell ]; then
                echo Hello World
               else
                clear
                echo rossz vlasz
               fi
           done

   Ha lefuttatod a szkriptet lthatod, hogy ez a programozk lma, ha
   szveges menkrl van sz. Biztos szrevetted, hogy ez nagyon
   hasonlt a "for" ciklusra. Csak itt ahelyett, hogy minden $OPTIONS
   elemre egyszeren vgrehajtannk a ciklust, mindig "meglltjuk" a
   felhasznlt.

9.2 A parancssor hasznlata

          #!/bin/bash
          if [ -z "$1" ]; then
              echo hasznlat: $0 knyvtrnv
              exit
          fi
          SRCD=$1
          TGTD="/var/backups/"
          OF=home-$(date +%Y%m%d).tgz
          tar -cZf $TGTD$OF $SRCD

   Vilgosnak kell lennie szmodra annak, hogy ez a szkript mit csinl.
   Az els felttelben szerepl kifejezssel megnzzk, hogy a program
   kapott-e argumentumot ($1). Ha nem, kilpnk, s egy hasznlati
   tmutatt jelentnk meg a felhasznlnak. A program tbbi rsznek
   ezen a ponton mr tisztnak kell lennie.

10. Egyebek

10.1 Adatok bekrse felhasznltl: read

   Sok esetben szksg lehet arra, hogy adatokat krjnk be a
   felhasznltl. Erre szmos lehetsgnk van, melyek kzl egy a
   kvetkez:

                #!/bin/bash
                echo Krlek add meg a neved
                read NAME
                echo "Hi $NAME!"

   A read segtsgvel egyszerre tbb adatot is be tudsz olvasni. A
   kvetkez plda ezt tisztzza.

                #!/bin/bash
                echo Krlek add meg a vezetk- s keresztneved
                read FN LN
                echo "Hi! $LN, $FN !"

10.2 Aritmetikai kifejezsek kirtkelse

   A parancssorba (vagy a shell-be) rd be a kvetkezt:

   echo 1 + 1

   Ha "2"-t vrtl eredmnyl bizonyra csaldott vagy. De mi van akkor,
   ha azt szeretnd, hogy a bash ki is rtkelje a szmokat? A megolds a
   kvetkez:

   echo $((1+1))

   Ez mr sokkal logikusabb kimenetet ad. gy kell egy aritmetikai
   kifejezst kirtkelni. Ugyanezt az eredmnyt kapod a kvetkezvel:

   echo $[1+1]

   Ha trtekre vagy ms matematikai jelleg dolgokra van szksged, vagy
   egyszeren csak ezt szeretnd hasznlni, akkor bc-vel is
   kirtkelheted az aritmetikai kifejezseket.

   Ha berom a parancssorba, hogy "echo $[3/4]", akkor 0-t kapok, mivel a
   bash csak egszekkel dolgozik. Az "echo 3/4|bc -l" parancsra viszont
   mr helyes eredmnyt ad, azaz 0.75-t.

10.3 A bash felkutatsa

   Mike levele nyomn (nzd meg a ksznetnyilvntst):

   Eddig mindig a "#!/bin/bash" formt hasznltuk, most itt van pr plda
   arra, hogyan tudhatod meg a bash konkrt elrsi tjt.

   A "locate bash" az egyik legjobb mdszer erre a feladatra, de nem
   minden rendszeren van locate.

   A gykrbl kiadott "find ./ -name bash" legtbbszr mkdik.

   A lehetsges helyek, ahol nzeldhetsz:

   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 kapsbl nem jut tbb eszembe... A legtbb rendszeren

   ezen knyvtrak valamelyikben lesz).

   Vagy megprblhatod a "which bash" parancsot is.

10.4 Program visszatrsi rtknek kidertse

   Bash-ban a programok visszatrsi rtke egy specilis vltozban
   troldik, melynek neve $?.

   A kvetkez plda bemutatja, hogyan derthetjk ki egy program
   visszatrsi rtkt. Felttelezem, hogy a dada nev knyvtr nem
   ltezik. (Ez szintn Mike javaslatra kerlt ide.)

        #!/bin/bash
        cd /dada &> /dev/null
        echo rv: $?
        cd $(pwd) &> /dev/null
        echo rv: $?

10.5 Parancs kimenetnek trolsa

   A kvetkez szkript listzza az sszes tblt az sszes adatbzisbl
   (felteszem, hogy MySQL-t hasznlsz). Megvltoztathatod a "mysql"
   parancsot gy, hogy valdi felhasznlnevet s jelszt hasznlsz.

        #!/bin/bash
        DBS=`mysql -uroot  -e"show databases"`
        for b in $DBS ;
        do
                mysql -uroot -e"show tables from $b"
        done

10.6 Tbb forrsfjl hasznlata

   A "source" parancs segtsgvel tbb fjlt is hasznlhatsz egyszerre.

   __TO-DO__

11. Tblzatok

11.1 Sztring sszehasonlt opertorok

   (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 tbb karakterbl ll)

   (6) s1 nulla

11.2 Pldk sztingek sszehasonltsra

   Kt sztring sszehasonltsa.

        #!/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 idzek egy rszt Andreas Beck levelbl, az if [ $1 = $2 ] alak
   utastsokkal kapcsolatban.

   Nem tl j tlet a fenti pldban is lthat mdszert hasznlni, mert
   ha a $S1 vagy a $S2 res, rtelmezsi hibt kapunk. Helyette
   hasznljuk inkbb az x$1=x$2 vagy a "$1"="$2" formt.

11.3 Aritmetikai opertorok

   +

   -

   *

   /

   % (maradk)

11.4 Aritmetikai relcis opertorok

   -lt (<)

   -gt (>)

   -le (<=)

   -ge (>=)

   -eq (==)

   -ne (!=)

   A C programozk egyszeren ssze tudjk vetni ezen opertorokat a
   zrjelek kzt megadottakkal.

11.5 Hasznos parancsok

   Ezt a rszt Kees jrarta (nzd meg a ksznetnyilvntst...).

   Nhny ezek kzl a programok kzl egy komplett programozsi nyelvet
   takar. Ezen parancsok esetn csak az alapokat ismertetjk. Ha
   rszletes lersra is szksged van nzd meg a parancsok kziknyv
   oldalait (man pages).

   sed (folyam szerkeszt)

   A sed egy nem interaktv szerkesztprogram. Ez azt jelenti, hogy a
   fjlok mdostsa nem gy megy, hogy mozgatod a kurzort a kpernyn.
   Itt szerkeszt utastsokbl ll szkripteket hasznlunk s egy
   fjlnevet, amit szerkeszteni akarunk. A sed tulajdonkppen egy
   szrnek is felfoghat. Nzzk az albbi pldkat:

        $sed 's/mit_cserljek/mire_cserljem/g' /tmp/dummy

   A sed kicserli a "mit_cserljek" szveget a "mire_cserljem"
   szveggel, s a bemenett a /tmp/dummy fjlbl veszi. A vgeredmny az
   stdout-ra lesz kldve (ami alapesetben a konzol), de ha a sor vghez
   rod, hogy "> fjlnv", akkor a sed kimenett a "fjlnv" nev fjlba
   kldi.

        $sed 12, 18d /tmp/dummy

   A sed, a 12. s 18. sorok kzti rsz kivtelvel kirja a fjl
   tartalmt. Az eredeti fjl nem vltozik.

   awk (fjlok mdostsa, szveg kinyerse s szerkesztse)

   Az AWK-nak szmos implementcija ltezik (a legismertebbek a GNU-s
   gawk s az n. "j awk", a mawk). Az alapelv egyszer: az AWK mintt
   keres s minden illeszked mintra vgrehajt valamilyen mveletet.

   Megint ltrehoztam egy dummy nev fjlt, ami a kvetkez sorokbl
   ll:

   "test123

   test

   tteesstt"

        $awk '/test/ {print}' /tmp/dummy

   test123

   test

   A minta, amit az AWK keres, a "test". Ha a /tmp/dummy fjlban tallt
   egy sort, amiben szerepelt a "test" sz, akkor vgrehajtotta r a
   "print" mveletet.

        $awk '/test/ {i=i+1} END {print i}' /tmp/dummy

   3

   Ha sokfle mintra keresel, cserld ki az idzjelek kzti szveget
   "-f file.awk"-ra s a mintkat, vgrehajtand tevkenysgeket rd a
   "file.awk" nev fjlba.

   grep (a keressi mintra illeszked sorok kirsa)

   Az elz fejezetekben mr j nhny grep parancsot lttunk, amelyek
   az illeszked sorokat rtk ki. De a grep tbbre is kpes.

        $grep "ezt keressk" /var/log/messages -c

   12

   Az "ezt keressk" szveg 12-szer szerepelt a /var/log/messages nev
   fjlban.

   [J, ez csak egy kitallt plda, a /var/log/messages meg lett
   buherlva. :-)]

   wc (sorok, szavak, bjtok megszmolsa)

   A kvetkez pldban mst kapunk, mint amit vrunk. A dummy nev
   fjl, amit most hasznlunk, a kvetkez szveget tartalmazza: "bash
   bevezets HOWTO teszt fjl"

        $wc --words --lines --bytes /tmp/dummy

   2 5 34 /tmp/dummy

   A wc nem foglalkozik a paramterek sorrendjvel. Mindig egy elre
   megadott sorrendben rja ki ket, amint azt te is lthatod:
   (sorok)(szavak)(bjtok)(fjlnv).

   sort (szveges fjl sorainak rendezse)

   Most a dummy fjl a kvetkezket tartalmazza:

   "b

   c

   a"

        $sort /tmp/dummy

   A kimenet kb gy nz ki:

   a

   b

   c

   A parancsok nem lehetnek ilyen egyszerek :-)

   bc (egy szmolgpes programozsi nyelv)

   A bc a parancssorbl kapja meg a szmtsi feladatokat (fjlbl, nem
   pedig tirnyts vagy cs tjn), esetleg egy felhasznli
   felletrl. A kvetkezkben pldkon keresztl bemutatunk nhny
   parancsot.

   A bc-t a -q paramterrel indtom, hogy ne rja ki az dvzl
   szveget.

   $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 (terminl inicializlsra vagy a terminfo adatbzis
   lekrdezsre)

   Egy kis plda a tput kpessgeinek demonstrlsra:

        $tput cup 10 4

   A kurzor a (y10,x4)-es pozciban jelenik meg.

        $tput reset

   Trli a kpernyt, s a kurzor az (y1,x1) pozciba kerl. Az (y0,x0)
   a bal fels sarok koordintja.

        $tput cols

   80

   Az x tengely irnyban maximlisan elhelyezhet karakterek szma.

   Nagyon ajnlott, hogy legalbb ezen programok hasznlatval tisztban
   legyl. Milli olyan kis program van, amikkel csodkra lehetsz kpes a
   parancssorban.

   [Nhny plda kziknyv oldalbl vagy GYIK-bl szrmazik.]

12. Mg nhny szkript

12.1 Parancs vgrehajtsa a knyvtrban lv sszes fjlra

12.2 Plda: 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 Fjl tnevez program


             #!/bin/sh
             # renna: egyszerre tbb fjl tnevezse klnbz szablyok szeri
nt
             # rta: Felix Hudson (2000. janur)

             # elszr is megnzzk, hogy a program milyen "zemmdban" van
             # ha az els paramter ($1) alapjn valamelyik felttel teljesl
vgrehajtjuk
             # a hozz tartoz programrszt s kilpnk

             # eltag (prefix) szerint trtn tnevezs?
             if [ $1 = p ]; then

             # most megszabadulunk a mdot tartalmaz vltoztl ($1) s a pref
ixtl ($2)
               prefix=$2 ; shift ; shift

             # megnzzk, adtak-e meg fjlnevet
             # ha nem, jobb ha nem csinlunk semmit, minthogy nemltez fjlok
at
             # nevezznk t

               if [$1 = ]; then
                  echo "nem adtl meg fjlnevet"
                  exit 0
               fi

             # ez a for ciklus vgigmegy a megadott fjlokon s mindet
             # egyenknt tnevezi
               for file in $*
                 do
                 mv ${file} $prefix$file
               done

             # kilpnk a programbl
               exit 0
             fi

             # uttag (suffix) szerinti tnevezs?
             # az ide tartoz rsz tulajdonkppen megegyezik az elzvel
             # nzd meg az ottani megjegyzseket
             if [ $1 = s ]; then
               suffix=$2 ; shift ; shift

                if [$1 = ]; then
                 echo "nem adtl meg fjlnevet"
                exit 0
                fi

              for file in $*
               do
                mv ${file} $file$suffix
              done

              exit 0
             fi

             # helyettestses tnevezs?
             if [ $1 = r ]; then

               shift

             # ezt a rszt azrt raktam bele, hogy ne tegyk tnkre a felhaszn
l egyik
             # llomnyt se, ha helytelenek a paramterek
             # ez csak egy biztonsgi intzkeds

               if [ $# -lt 3 ] ; then
                 echo "hasznlat: renna r [kifejezs] [helyettests] fjlok...
 "
                 exit 0
               fi

             # tovbblpnk a paramterlistn
               OLD=$1 ; NEW=$2 ; shift ; shift

             # Ez a for ciklus vgigmegy az sszes fjlon amit a programnak ta
dtak,
             # s egyenknt tnevezi ket a "sed" program segtsgvel.
             # A "sed" egyszer parancssori program, ami rtelmezi a bemenetet
 s
             # kicserli a belltott kifejezst egy adott szvegre.
             # Mi itt a fjl nevt adjuk t neki (standard bemenetknt), s kic
serljk
             # benne a kifejezsnek megfelel szvegrszeket.

               for file in $*
               do
                 new=`echo ${file} | sed s/${OLD}/${NEW}/g`
                 mv ${file} $new
               done
             exit 0
             fi

             # Ha idig eljutottunk, akkor semmi hasznlhatt nem adtak t a pr
ogramnak
             # ezrt kirjuk a felhasznlnak, hogyan hasznlja ezt a szkriptet
.
             echo "hasznlat:"
             echo " renna p [eltag] fjlok.."
             echo " renna s [uttag] fjlok.."
             echo " renna r [kifejezs] [helyettests] fjlok.."
             exit 0

             #ennyi!


12.4 tnevez program (egyszer vltozat)

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

13.1 A bash meghvsnak mdjai

   J dolog, ha az els sorban a kvetkez szerepel:

          #!/bin/bash -x

   Ennek hatsra rdekes kimeneti informcikat kaphatunk.

14. A dokumentumrl

   Szabadon kldhetsz javaslatokat/hibajavtsokat vagy brmi olyat,
   amirl gy gondolod, hogy rdekes s szvesen ltnd a dokumentumban.
   Megprblom majd olyan gyakran frissteni a lerst, amilyen gyorsan
   csak tudom.

14.1 (nincs) garancia

   A dokumentummal kapcsolatban semmifle garancia nincs.

14.2 Fordtsok

   Olasz: by William Ghelfi (wizzy at tiscalinet.it) [7]itt a cm

   Francia: by Laurent Martelli [8]nincs cm

   Koreai: Minseok Park [9]http://kldp.org

   Koreai: Chun Hye Jin [10]ismeretlen

   Spanyol: ismeretlen [11]http://www.insflug.org

   Lehet, hogy tbb fordts is van, de n nem tudok rla. Ha neked ilyen
   van, krlek kldd el, hogy frissthessem ezt a rszt.

14.3 Ksznet

     * Azoknak, akik ms nyelvekre fordtottk a dokumentumot (lsd:
       elz rsz).
     * Nathan Hurstnek a sok hibajavtsrt.
     * Jon Abbottnak az aritmetikai kifejezsek kirtkelshez fztt
       megjegyzseirt.
     * Felix Hudsonnak a renna szkriptrt
     * Kees van den Broeknek (szmos hibajavtsrt s a "Hasznos
       parancsok" cm fejezet jrarsrt)
     * Mikenak (pink), a bash felkutatsval s fjlok tesztelsvel
       kapcsolatos javaslatairt.
     * Fieshnek, a ciklusokkal foglalkoz rszben tett hasznos
       megjegyzsrt.
     * Lionnak, akinek javaslatra megemltettnk egy gyakori hibt
       (./hello.sh: Command not found).
     * Andreas Becknek a hibajavtsokrt s megjegyzsekrt.

14.4 Trtnet

   j fordtsok s lnyegi javtsok.

   A Kess ltal trt hasznos parancsok rsz hozzadsa.

   Hibajavtsok, javaslatok.

   Pldk a sztring sszehasonltshoz.

   v0.8 Elhagyom a verziszmozst, rjttem, hogy a dtum is elg.

   v0.7 Szmos hibajavts s pr rgi TO-DO rsz megrsa.

   v0.6 Kisebb javtsok.

   v0.5 Az tirnytssal foglalkoz rsz hozzadsa.

   v0.4 A volt fnkmnek ksznheten a doksi eltnt a rgi
   helyrl, most a www.linuxdoc.org cmen rhet el.

   eltte: Nem emlkszem, nem hasznltam se rcs-t, se cvs-t. :(

14.5 Tovbbi forrsok

   Bevezets a bash programozsba (BE alatt)
   [12]http://org.laol.net/lamug/beforever/bashtut.htm

   Bourne shell programozs [13]http://207.213.123.70/book/

14.6 Tovbbi forrsok magyarul

   (Ezeket a forrsokat a lektor gyjttte ssze.)

   Bki Andrs: "UNIX/Linux hjprogramozs" (ISBN: 963 9301 10 8)

   Bourne shell programozs
   [14]http://www.inf.u-szeged.hu/~bmse/unix/unix3.html

   Shell programozs
   [15]http://shell-script-programing.sync.hu/SHELL_PROGRAMOZAS.htm

   Shell programozs
   [16]http://www.fsz.bme.hu/~szebi/slides/U3/sld010.htm

   Shell programozs [17]http://www.szabilinux.hu/ufi/10.html

References

   1. http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
   2. mailto:    Kovacs.Ferenc.5[kukac]stud.u-szeged[pont]hu
   3. mailto: dacas[kukac]freemail[pont]hu
   4. http://tldp.fsf.hu/
   5. http://www.u-szeged.hu/
   6. http://www.inf.u-szeged.hu/~havasi/opensource/
   7. http://web.tiscalinet.it/penguin_rules
   8. http:///
   9. http://kldp.org/
  10. file://localhost/home/dacas/tldp/convert/Bash-Prog-Intro-HOWTO-hu.html
  11. http://www.insflug.org/
  12. http://org.laol.net/lamug/beforever/bashtut.htm
  13. http://207.213.123.70/book/
  14. http://www.inf.u-szeged.hu/~bmse/unix/unix3.html
  15. http://shell-script-programing.sync.hu/SHELL_PROGRAMOZAS.htm
  16. http://www.fsz.bme.hu/~szebi/slides/U3/sld010.htm
  17. http://www.szabilinux.hu/ufi/10.html
