
                     Uvod v programiranje v BASH - HOW-TO

Mike G mikkey at dynamo.com.ar

   et Jul 27 09:36:18 ART 2000
     _________________________________________________________________

   Ta spis vam bo pomagal pri vaih zaetkih pisanja osnovnih in nekoliko
   zahtevnejih  lupinskih  skriptov.  Njegov  namen  ni  biti vsemogoen
   vodnik  (glej naslov). Sam NISEM nikakren izvedenec v programiranju v
   lupini  in sem ta spis napisal zato, ker se bom pri tem veliko nauil,
   poleg  tega  pa  bo  morda koristilo tudi drugim ljudem. Vsak odziv je
   dobrodoel, e posebno v obliki popravkov :) 
     _________________________________________________________________


Kazalo


1. Uvod

     * 1.1 Kje dobiti najnovejo razliico?
     * 1.2 Potrebno znanje
     * 1.3 Uporaba tega spisa

2. Zelo preprosti skripti

     * 2.1 Tradicionalen skript 'Hello World'
     * 2.2 Zelo preprost skript za varnostno kopijo

3. Vse o preusmerjanju

     * 3.1 Teorija in hitri napotki
     * 3.2 Primer: stdout v datoteko
     * 3.3 Primer: stderr v datoteko
     * 3.4 Primer stdout v stderr
     * 3.5 Primer: stderr v stdout
     * 3.6 Primer: stderr in stdout v datoteko

4. Cevovodi

     * 4.1 Kaj so cevovodi in zakaj bi jih hoteli uporabljati
     * 4.2 Primer: preprost cevovod s programom sed
     * 4.3 Primer: alternativa ukazu 'ls -l *.txt'

5. Spremenljivke

     * 5.1 Primer: Hello World! z uporabo spremenljivk
     * 5.2  Primer:  Zelo  preprost  skript za varnostno kopijo (nekoliko
       bolji)
     * 5.3 Lokalne spremenljivke

6. Pogojni stavki

     * 6.1 Teorija
     * 6.2 Primer: Osnovni pogojni stavek if .. then
     * 6.3 Primer: Osnovni pogojni stavek if .. then ... else
     * 6.4 Primer: pogojni stavki s spremenljivkami

7. Zanke for, while in until

     * 7.1 Primer zanke for
     * 7.2 Zanka for kot v programskem jeziku C
     * 7.3 Primer zanke while
     * 7.4 Primer zanke until

8. Funkcije

     * 8.1 Primer funkcij
     * 8.2 Primer funkcije s parametri

9. Uporabniki vmesniki

     * 9.1 Uporaba select za ustvarjanje preprostih menijev
     * 9.2 Uporaba parametrov z ukazne vrstice

10. Razno

     * 10.1 Branje uporabnikovega vnosa z read
     * 10.2 Raunanje
     * 10.3 Iskanje bash
     * 10.4 Vrnjena vrednost programa
     * 10.5 Zajemanje izhoda ukaza
     * 10.6 Ve izvornih datotek

11. Tabele

     * 11.1 Primerjalni operatorji za nize
     * 11.2 Primerjave nizov
     * 11.3 Aritmetini operatorji
     * 11.4 Primerjalni aritmetini operatorji
     * 11.5 Prironi ukazi

12. e ve skriptov

     * 12.1 Izvajanje ukaza na vseh datotekah v imeniku.
     * 12.2  Primer:  Preprost  skript  za  varnostno kopijo (e nekoliko
       bolji)
     * 12.3 Preimenovalnik datotek
     * 12.4 Preimenovalnik datotek (preprost)

13. Ko gre kaj narobe (razhroevanje)

     * 13.1 Naini klicanja BASH

14. O tem spisu

     * 14.1 (brez) jamenja
     * 14.2 Prevodi
     * 14.3 Zahvale
     * 14.4 Zgodovina
     * 14.5 e ve virov
     _________________________________________________________________


1. Uvod

1.1 Kje dobiti najnovejo razliico?

   http://www.linuxdoc.org/HOWTO/Bash-Prog-Intro-HOWTO.html

1.2 Potrebno znanje

   Dobro   poznavanje   ukazne  vrstice  GNU/Linux  ter  osnovnih  pojmov
   programiranja je dobrodolo. eprav tole ni uvod v programiranje samo,
   pojasnjuje  (oziroma  si  vsaj  prizadeva  pojasniti)  mnogo  osnovnih
   pojmov.

1.3 Uporaba tega spisa

   Ta spis vam bo priel prav v sledeih primerih:
     * Imate  nekaj  predstav  o  programiranju  in bi radi zaeli pisati
       lupinske skripte.
     * Imate  nejasno  predstavo  o  programiranju  in  potrebujete nekaj
       napotkov.
     * elite  videti  nekaj lupinskih skriptov ter komentarjev, da boste
       lahko zaeli pisati svoje lastne.
     * Selite  se iz DOS/Windows (oziroma ste se pravkar preselili) in bi
       eleli narediti "paketne" procese.
     * Ste  popoln  raunalniki  navduenec in preberete vsak how-to, ki
       vam pride na pot.

2. Zelo preprosti skripti

   Ta HOW-TO vam bo dal nekaj namigov o lupinskih skriptih, ki bodo mono
   oprti na primere.

   V  tem  delu  boste nali nekaj kratkih skriptov, ki vam bodo pomagali
   razumeti razline tehnike.

2.1 Tradicionalen skript 'Hello World'

          #!/bin/bash
          echo Hello World

   Ta  skript ima samo dve vrstici. Prva pove sistemu, kateri program naj
   uporabi pri zaganjanju datoteke.

   Druga  vrstica  vsebuje  edin  ukaz, ki ga skript izvede, in ta izpie
   'Hello World' na terminal.

   e  dobite  nekaj  kot  ./hello.sh:  Command  not  found., je verjetno
   napana  prva vrstica, '#!/bin/bash' - da bi ugotovili pravilno pot do
   bash izvedite 'whereis bash' ali poglejte v poglavje 'Iskanje bash'.

2.2 Zelo preprost skript za varnostno kopijo

        #!/bin/bash
        tar -cZf /var/moja-varnostna-kopija.tgz /home/jaz/

   V tem skriptu namesto izpisovanja sporoila na terminal naredimo arhiv
   uporabnikovega  domaega  imenika.  Ne  uporabljajte  tega  skripta  -
   obstaja tudi mnogo bolji, ki bo predstavljen kasneje.

3. Vse o preusmerjanju

3.1 Teorija in hitri napotki

   Obstajajo  trije  opisniki  datoteke - stdin (standardni vhod), stdout
   (standardni izhod) ter stderr (standardni izhod za napake).

   V osnovi lahko:
    1. preusmerite stdout v datoteko
    2. preusmerite stderr v datoteko
    3. preusmerite stdout v stderr
    4. preusmerite stderr v stdout
    5. preusmerite stderr in stdout v datoteko
    6. preusmerite stderr in stdout v stdout
    7. preusmerite stderr in stdout v stderr

   1 'predstavlja' stdout in 2 stderr.

   Majhno  pojasnilo  za  predstavo o teh stvareh: z ukazom less si lahko
   ogledate  tako  stdout (ki bo ostal v medpomnilniku) kot stderr, ki se
   bo  izpisal  na  zaslon,  vendar  bo  izginil,  ko  se boste poskuali
   premikati po medpomnilniku.

3.2 Primer: stdout v datoteko

   To bo preusmerilo izhodni tok programa v datoteko.

        ls -l > ls-l.txt

   V  tem  primeru  bo  ustvarjena  datoteka  z  imenom 'ls-l.txt', ki bo
   vsebovala  tisto,  kar  bi  se sicer izpisalo na zaslon, ko bi pognali
   ukaz 'ls -l'.

3.3 Primer: stderr v datoteko

   Takole lahko standardni izhod za napake preusmerimo v datoteko.

        grep da * 2> grep-napake.txt

   Ustvarjena  bo  datoteka z imenom 'grep-napake.txt', v njej pa bo vse,
   kar bo ukaz 'grep da *' izpisal na stderr.

3.4 Primer stdout v stderr

   Tukaj  bomo izhodni tok stdout preusmerili v isti opisnik datoteke kot
   stderr.

        grep da * 1>&2

   Del izpisa, ki bi sicer el na stdout, bo v tem primeru preusmerjen na
   stderr.

3.5 Primer: stderr v stdout

   To  bo povzroilo, da bo izhodni tok stderr preusmerjen v isti opisnik
   datoteke kot stdout.

        grep * 2>&1

   Stderr  del  izhodnega  toka bo tako preusmerjen na standardni izhodni
   tok - e boste ta ukaz preko cevovoda povezali s programom less, boste
   opazili,  da  bodo  vrstice, ki navadno 'izginejo' (ker so izpisane na
   stderr), tokrat ostale vidne (ker smo jih preusmerili na stdout).

3.6 Primer: stderr in stdout v datoteko

   Celoten  izhodni  tok  programa bomo preusmerili v datoteko. To vasih
   pride prav pri izvajanju opravil v cron-u, ko elite ukaz "utiati".

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

   Ta  ukaz  (e  vedno  smo pri vnosu v cron) bo izbrisal vse datoteke z
   imenom  'core',  ki  se  bodo  nahajale v kateremkoli imeniku. Naj vas
   opozorim, da morate biti precej gotovi glede tega, kaj bo ukaz storil,
   vkolikor boste njegov izhod zavrgli.

4. Cevovodi

   To  poglavje  preprosto in praktino razloi kako uporabljati cevovode
   in zakaj bi to sploh hoteli.

4.1 Kaj so cevovodi in zakaj bi jih hoteli uporabljati

   Cevovodi  vam  omogoajo  (zelo  preprosto) povezati izhodni tok enega
   programa z vhodnim tokom drugega.

4.2 Primer: preprost cevovod s programom sed

   To je zelo preprost nain uporabe cevovodov.

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

   V  tem primeru se zgodi sledee: najprej se izvi ukaz 'ls -l', njegov
   izhodni tok pa je - namesto, da bi se izpisal na terminal - posredovan
   programu sed, ki nato izpie, kar mu je zaukazano.

4.3 Primer: alternativa ukazu 'ls -l *.txt'

   To  je  verjetno bolj neroden nain izvajanja 'ls -l *.txt', vendar je
   tu  zaradi  prikaza  delovanja  cevovodov  in  ne  zaradi  odloanja o
   primernosti uporabe ukaza samega.

        ls -l | grep "\.txt$"

   Tukaj  je  izhodni tok ukaza 'ls -l' posredovan programu grep, ki nato
   izpie vrstice, ki vsebujejo regularni izraz "\.txt$".

5. Spremenljivke

   Spremenljivke   lahko   uporabljate  prav  tako,  kot  v  vseh  drugih
   programskih  jezikih. Podatkovnih tipov tukaj ni - spremenljivka lahko
   vsebuje tevilo, znak ali niz znakov.

   Spremenljivke  vam  ni  treba  deklarirati,  ustvari  se  takoj, ko ji
   pripiete vrednost.

5.1 Primer: Hello World! z uporabo spremenljivk

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

   Vrstica  2 ustvari spremenljivko z imenom NIZ in ji priredi niz "Hello
   World!".  VREDNOST  spremenljivke  nato  dobimo  tako,  da  na zaetek
   postavimo  znak  '$'.  e  tega  znaka  ne  boste  uporabili, bo izhod
   programa  drugaen  -  verjetno  ne  taken,  kot  bi  si  eleli (kar
   poskusite!).

5.2 Primer: Zelo preprost skript za varnostno kopijo (nekoliko bolji)

           #!/bin/bash
           DATOTEKA=/var/moja-varnostna-kopija-$(date +%Y%m%d).tgz
           tar -cZf $DATOTEKA /home/jaz/

   Ta   skript   prinaa  e  eno  novost.  Za  zaetek  morate  razumeti
   ustvarjanje  spremenljivke in prirejanje vrednosti v vrstici 2. Gotovo
   ste  opazili  izraz  '$(date  +%Y%m%d)'; e boste skript tudi pognali,
   boste ugotovili, da izvri ukaz med oklepaji ter zajame njegov izhod.

   Ime  izhodne  datoteke  tega  skripta bo vsak dan drugano, ker smo za
   ustvarjanje  imena  uporabili  ukaz  date  s  predpisano obliko izhoda
   (+%Y%m%d).  To  lahko  e  nadalje  spremenite  z  druganim predpisom
   oblike.

   e nekaj primerov:

   echo ls

   echo $(ls)

5.3 Lokalne spremenljivke

   Lokalne spremenljivke lahko ustvarimo s kljuno besedo local.

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

   Ta primer nazorno prikazuje uporabo lokalne spremenljivke.

6. Pogojni stavki

   Pogojni  stavki  vam omogoajo odloitev o izvajanju niza ukazov glede
   na ovrednotenje doloenega izraza.

6.1 Teorija

   Pogojni  stavki  imajo  mnogo oblik. Najbolj osnovna je: if izraz then
   stavek  pri  emer se 'stavek' izvri le, e je 'izraz' ovrednoten kot
   resnien.  '2<1'  je na primer izraz, ki je ovrednoten kot neresnien,
   '2>1' pa kot resnien.

   Pogjni stavki imajo tudi drugane oblike, kot na primer: if izraz then
   stavek1  else  stavek2.  'stavek1'  je v tem primeru izvren le, e je
   'izraz' resnien, sicer pa se izvri 'stavek2'

   e  ena oblika pogojnih stavkov: if izraz1 then stavek1 else if izraz2
   then  stavek2  else  stavek3.  Tukaj je dodan le del "ELSE IF 'izraz2'
   THEN  'stavek2'",  ki  izvri 'stavek2', e je 'izraz2' ovrednoten kot
   resnien. Vse ostalo verjetno razumete (glejte prejnje oblike).

   Nekaj besed o sintaksi:

   Osnova za konstrukcijo 'if' je v bash takna:

   if [izraz];

   then

   ukazi, e je 'izraz' resnien

   fi

6.2 Primer: Osnovni pogojni stavek if .. then

            #!/bin/bash
            if [ "foo" = "foo" ]; then
               echo izraz je ovrednoten kot resnien
            fi

   Ukazi,  ki se izvrijo, e je izraz v oglatih oklepajih ovrednoten kot
   resnien,  so  navedeni  med  'then'  in  'fi'  -  'fi' oznauje konec
   pogojenih ukazov.

6.3 Primer: Osnovni pogojni stavek if .. then ... else

            #!/bin/bash
            if [ "foo" = "foo" ]; then
               echo izraz je ovrednoten kot resnien
            else
               echo izraz je ovrednoten kot neresnien
            fi

6.4 Primer: pogojni stavki s spremenljivkami

            #!/bin/bash
            T1="foo"
            T2="bar"
            if [ "$T1" = "$T2" ]; then
                echo izraz je ovrednoten kot resnien
            else
                echo izraz je ovrednoten kot neresnien
            fi

7. Zanke for, while in until

   To poglavje razlaga zanke for, while in until.

   Zanka  for  se nekoliko razlikuje od takne zanke v drugih programskih
   jezikih. Omogoa vam zanko, ki se ponovi za vsako 'besedo' v doloenem
   nizu.

   While   ponavlja  ukaze,  dokler  je  nadzorni  izraz  ovrednoten  kot
   resnien;  ustavi se, ko postane izraz neresnien oziroma ko naleti na
   ukaz za prekinitev zanke.

   Zanka  until  deluje  skoraj  enako  kot while, z razliko, da se ukazi
   izvajajo, dokler je nadzorni izraz ovrednoten kot neresnien.

7.1 Primer zanke for

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

   V  drugi  vrstici  deklariramo  spremenljivko i, kateri bomo pripisali
   razline vrednosti iz $( ls ).

   Tretja vrstica bi bila po potrebi lahko tudi dalja oziroma bi se pred
   'done' (4) lahko zvrstilo ve ukazov.

   'done'  (4) pove, da je ukazov, ki so uporabljali $i konec in da lahko
   $i pripiemo novo vrednost.

   Ta  skript sicer ne pone niesar koristnega, lahko pa bi mu na primer
   naroili, naj izpie le doloene datoteke (glej prejnji primer).

7.2 Zanka for kot v programskem jeziku C

   Ta zanka je bolj podobna zanki for v C/perl.

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

7.3 Primer zanke while

         #!/bin/bash
         STEVEC=0
         while [ $STEVEC -lt 10 ]; do
             echo Stevec kaze $STEVEC
             let STEVEC=STEVEC+1
         done

   Ta  skript  'oponaa'  dobro  znano  strukturo 'for' (C, Pascal, perl,
   itd.)

7.4 Primer zanke until

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

8. Funkcije

   Kot  v  skoraj  vsej  programskih  jezikih lahko tudi tu zdruite dele
   programa  v  funkcije - tako bolj smiselno organizirate program ali pa
   vadite umetnost rekurzije.

   Deklaracija  funkcije  je  na  mo preprosta: function moja_funkcija {
   moji_ukazi }.

   Funkcijo  kliete  tako, kot bi bila drug program; samo napiete njeno
   ime.

8.1 Primer funkcij

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

   Vrstice  2-4  opisujejo  funkcijo  'izhod',  vrstice  5-7  pa funkcijo
   'hello'.  e  niste  popolnoma  prepriani,  kaj naredi ta skript, kar
   poskusite!

   Kot  vidite  funkcij  ni  potrebno deklarirati v kakrnemkoli posebnem
   vrstnem redu.

   Ko  boste  skript pognali, bo ta najprej klical funkcijo 'hello', nato
   funkcijo 'izhod'. Vrstice 10 skript ne bo dosegel nikoli.

8.2 Primer funkcije s parametri

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


   Ta  skript  je  skoraj  popolnoma  enak  prejnjemu. Glavna razlika je
   funkcija  'e', ki izpie svoj prvi parameter. Parametri, ki jih podamo
   funkciji so obravnavani enako kot parametri, podani skriptu.

9. Uporabniki vmesniki

9.1 Uporaba select za ustvarjanje preprostih menijev

           #!/bin/bash
           IZBIRE="Pozdrav Izhod"
           select opt in $IZBIRE; do
               if [ "$opt" = "Izhod" ]; then
                echo koncano
                exit
               elif [ "$opt" = "Pozdrav" ]; then
                echo Hello World
               else
                clear
                echo nedovoljena izbira
               fi
           done

   e  boste  pognali  ta skript, boste ugotovili, da so to programerjeve
   sanje  za ustvarjanje tekstnih menijev. Konstrukcija je na mo podobna
   'for',  le  da namesto izvritve seznama ukazov povpraa uporabnika za
   vsako 'besedo' v $IZBIRE.

9.2 Uporaba parametrov z ukazne vrstice

          #!/bin/bash
          if [ -z "$1" ]; then
              echo uporaba: $0 imenik
              exit
          fi
          IZVORNA_MAPA=$1
          CILJNA_MAPA="/var/varnostne_kopije/"
          DATOTEKA=home-$(date +%Y%m%d).tgz
          tar -cZf $CILJNA_MAPA$DATOTEKA $IZVORNA_MAPA

   Kaj  naredi ta skript bi vam moralo biti jasno. Izraz v prvem pogojnem
   stavku  preveri, ali je program dobil parameter ($1). V primeru, da ga
   ni,  se skript kona z izpisom navodila za uporabo. Preostanek skripta
   verjetno razumete.

10. Razno

10.1 Branje uporabnikovega vnosa z read

   Gotovo bodo prilonosti, ko boste eleli, da uporabnik kaj vpie. Tole
   je eden od monih nainov:

                #!/bin/bash
                echo Vnesite svoje ime
                read IME
                echo "Zdravo, $IME!"

   Z read lahko dobite tudi ve vrednosti hkrati:

                #!/bin/bash
                echo Vnesite svoje ime in priimek
                read IME PRIIMEK
                echo "Zdravo, $PRIIMEK $IME!"

10.2 Raunanje

   V ukazni vrstici poskusite tole:

   echo 1 + 1

   e  ste  priakovali,  da boste dobili '2', boste nekoliko razoarani.
   Kaj  storiti,  e elite, da vam BASH pomaga izraunati nekaj raunov?
   Reitev je takna:

   echo $((1+1))

   Ta ukaz bo dal bolj 'smiseln' izpis. Isto lahko doseete tudi takole:

   echo $[1+1]

   V primeru, da vai rauni vsebujejo ulomke ali tejo matematiko, lahko
   za raunanje uporabite program bc.

   e  na  primer  v  ukazni vrstici poenete "echo $[3/4]", boste dobili
   rezultat  0,  ker  bash  pri  izraunih  uporablja le cela tevila. Za
   pravilen  rezultat  bo  treba  pognati "echo 3/4|bc -l", kar bo vrnilo
   pravilen rezultat - 0,75.

10.3 Iskanje bash

   Mike (glejte Zahvale) v sporoilu pie:

   Primeri  vedno  uporabljajo  #!/bin/bash  ..  morda  bi  lahko navedel
   navodilo kako najti bash, e ga ni na tem mestu.

   e  najbolje  je  uporabiti  'locate  bash', vendar vsi sistemi nimajo
   programa locate.

   'find  ./  -name  bash'  v  korenskem  imeniku  je  navadno  prav tako
   uinkovit.

   Mesta, ki jih preverite:

   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

   (ve  mest  se  trenutno  ne  morem  domisliti... sicer pa sem bash po
   razlinih sistemih nael v enem od navedenih mest.

   Lahko poskusite tudi 'which bash'.

10.4 Vrnjena vrednost programa

   Bash shrani vrnjeno vrednost programa v posebno spremenljivko z imenom
   $?.

   Sledei  primer  prikazuje  kako  ugotoviti vrnjeno vrednost programa;
   predpostavljam,  da  imenik  dada  ne obstaja. (Tudi tole je predlagal
   mike.)

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

10.5 Zajemanje izhoda ukaza

   Ta  kratek  skript izpie vse tabele iz vseh podatkovnih baz (e imate
   seveda  nameen  MySQL).  Popraviti morate ukaz mysql, da bo vseboval
   veljavno uporabniko ime ter geslo.

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

10.6 Ve izvornih datotek

   Ve izvornih datotek lahko uporabite z ukazom source.

   __TO-DO__

11. Tabele

11.1 Primerjalni operatorji za nize

   (1) niz1 = niz2

   (2) niz1 != niz2

   (3) niz1 < niz2

   (4) niz1 > niz2

   (5) -n niz1

   (6) -z niz1

   (1) niz1 je enak niz2

   (2) niz1 ni enak niz2

   (3) __TO-DO__

   (4) __TO-DO__

   (5) niz1 ni prazen (vsebuje enega ali ve znakov)

   (6) niz1 je prazen

11.2 Primerjave nizov

   Primerjanje dveh nizov

        #!/bin/bash
        NIZ1='niz'
        NIZ2='Niz'
        if [ $NIZ1=$NIZ2 ];
        then
                echo "NIZ1('$NIZ1') je enak NIZ2('$NIZ2')"
        fi
        if [ $NIZ1=$NIZ1 ];
        then
                echo "NIZ1('$NIZ1') je enak NIZ1('$NIZ1')"
        fi

   Andreas Beck je v svojem sporoilu predlagal uporabo if [ $1 = $2 ].

   To  ni  pretirano  dobra  ideja,  ker boste v primeru, da je $NIZ1 ali
   $NIZ2  prazen,  dobili  sporoilo o napaki. Bolje je uporabiti x$1=x$2
   ali "$1"="$2"

11.3 Aritmetini operatorji

   +

   -

   *

   /

   % (ostanek)

11.4 Primerjalni aritmetini operatorji

   -lt (<)

   -gt (>)

   -le (<=)

   -ge (>=)

   -eq (==)

   -ne (!=)

   e  znate programirati v C-ju, preprosto izberite operator, ki ustreza
   izbranemu operatorju v oklepajih.

11.5 Prironi ukazi

   To poglavje je ponovno napisal Kees (glejte Zahvale).

   Nekateri  izmed  navedenih  ukazov  so  e  sami  po sebi skoraj pravi
   programski  jeziki,  zato  bodo  o njih povedane le osnovne stvari. e
   boste   eleli   bolj  poglobljen  opis,  si  lahko  ogledate  njihove
   prironike (man pages).

   sed (stream editor - urejevalnik toka)

   Sed  je ne-interaktiven urejevalnik. Datoteke ne urejate s premikanjem
   kurzorja  po  zaslonu,  temve sed-u podate skript navodil za urejanje
   ter ime datoteke. Sed bi lahko opisali tudi kot filter. Poglejmo nekaj
   primerov:

        $sed 's/za_zamenjavo/zamenjava/g' /tmp/nekaj

   Sed  zamenja niz 'za_zamenjavo' z nizom 'zamenjava', pri emer bere iz
   datoteke  /tmp/nekaj.  Rezultat bo poslan na standardni izhod (navadno
   konzola),  lahko  pa  seveda  na  konec ukaza dodate '>zajeto', kar bo
   preusmerilo izhod v datoteko 'zajeto'.

        $sed 12, 18d /tmp/nekaj

   Sed  bo  izpisal  vse  vrstice razen 12. in 18. Originalne datoteke ta
   ukaz ne spremeni.

   awk   (spreminjanje  podatkovnih  datotek,  iskanje  ter  procesiranje
   besedila)

   Obstaja   mnogo   izvedb   programskega   jezika  AWK  (najbolj  znana
   interpreterja  sta  GNU-jev  gawk  in  'new  awk'  mawk).  Princip  je
   preprost: AWK ie doloen vzorec ter izvri niz ukazov, ko ga najde.

   Ustvaril sem testno datoteko 'nekaj', ki vsebuje naslednje vrstice:

   "test123

   test

   tteesstt"

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

   test123

   test

   Vzorec,  ki  ga  AWK ie je 'test', ukaz, ki ga izvri, ko v datoteki
   /tmp/nekaj najde vrstico s tem vzorcem, pa 'print'.

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

   3

   V  primeru,  da  iete  mnogo vzorcev, je pametno zamenjati tekst med
   narekovaji z '-f datoteka.awk' in napisati vzorce ter ukaze v datoteko
   'datoteka.awk'.

   grep (izpie vrstice, ki vsebujejo iskani vzorec)

   Ukaz  grep  smo e nekajkrat sreali v prejnjih poglavjih, ko je bilo
   potrebno izpisati vrstice z iskanim vzorcem. Vendar grep zmore e ve.

        $grep "iemo tole" /var/log/messages -c

   12

   Niz "iemo tole" se je v datoteki /var/log/messages pojavil 12-krat.

   [priznam,  ta  primer  ni  popolnoma  resnien  -  malce  sem priredil
   /var/log/messages :-)]

   wc (preteje vrstice, besede ter znake)

   Ta  primer  ne  izpie  tono tistega, kar bi priakovali. Uporabljena
   testna  datoteka  vsebuje  naslednje  besedilo:  "uvod  v  bash testna
   datoteka"

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

   1 5 28 /tmp/nekaj

   Wc  se  za  vrstni  red  podanih  parametrov  ne  zmeni, temve izpie
   statistike vedno enako: <vrstice> <besede> <znaki> <datoteka>.

   sort (razvrsti vrstice besedila)

   To pot testna datoteka vsebuje naslednje besedilo:

   "b

   c

   a"

        $sort /tmp/nekaj

   Izpis izgleda takole:

   a

   b

   c

   Ukazi ne bi smeli biti tako enostavni :-)

   bc (programski jezik za raunanje)

   Bc  lahko  prebere raune iz datoteke, podane v ukazni vrstici, ali pa
   preko uporabnikega vmesnika. Ta primer prikazuje nekaj ukazov.

   Navadno  bc  zaenem  z  parametrom  -q, ki preprei izpis pozdravnega
   sporoila.

   $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 (inicializacija terminala ali poizvedba podatkovne baze terminfo)

   Manja demonstracija zmonosti programa tput:

        $tput cup 10 4

   Pozivnik se pojavi na (y10,x4)

        $tput reset

   Poisti  zaslon,  pozivnik pa se pojavi na (y1,x1). (y0,x0) je zgornji
   levi kot zaslona.

        $tput cols

   80

   Izpie tevilo znakov terminala v smeri osi x.

   Mono  vam  priporoam,  da  se  dobro seznanite z vsaj temi programi.
   Seveda  pa  obstaja  e mnoica drugih majhnih programov, s katerimi v
   ukazni vrstici lahko izvajate prave arovnije.

   [nekaj  primerov  v  tem  poglavju je vzetih iz prironikov in pogosto
   zastavljanih vpraanj]

12. e ve skriptov

12.1 Izvajanje ukaza na vseh datotekah v imeniku.

12.2 Primer: Preprost skript za varnostno kopijo (e nekoliko bolji)

            #!/bin/bash
            IZVORNA_MAPA="/home/"
            CILJNA_MAPA="/var/varnostne_kopije/"
            DATOTEKA=home-$(date +%Y%m%d).tgz
            tar -cZf $CILJNA_MAPA$DATOTEKA $IZVORNA_MAPA

12.3 Preimenovalnik datotek


             #!/bin/sh
             # renna: preimenuje ve datotek glede na doloena pravila
             # napisal felix hudson Jan - 2000

             # najprej preverimo za razline 'naine', ki jih program ima.
             # e prvi argument ($1) ustreza pogoju, izvedemo doloen del
             # programa ter nato konamo izvajanje skripta

             # preverimo, ali gre za primer predpone
             if [ $1 = p ]; then

             # sedaj se znebimo spremenljivke za nain ($1) ter predpone ($2)
               predpona=$2 ; shift ; shift

             # hiter test, ki preveri, ali so bila podana imena datotek
             # vkolikor niso bila, je bolje, da ne storimo niesar, kot
             # da poskusimo preimenovati datoteke, ki ne obstajajo!!

               if [$1 = ]; then
                  echo "datoteke niso bile podane"
                  exit 0
               fi

             # ta zanka se ponovi za vsako datoteko, ki je bila podana
             # skriptu ter preimenuje eno naenkrat
               for datoteka in $*
                 do
                 mv ${datoteka} $predpona$datoteka
               done

             # tukaj konamo izvajanje
               exit 0
             fi

             # preverimo, ali gre za preimenovanje konnice
             # ta del je skoraj enak prejnjemu, zato nima zaznamkov
             if [ $1 = k ]; then
               koncnica=$2 ; shift ; shift

                if [$1 = ]; then
                 echo "datoteke niso bile podane"
                exit 0
                fi

              for datoteka in $*
               do
                mv ${datoteka} $datoteka$koncnica
              done

              exit 0
             fi

             # preverimo, ali gre za zamenjavo vzorca
             if [ $1 = z ]; then

               shift

             # tale del sem vkljuil zato, da v primeru, ko uporabnik ne
             # navede parametrov, ne pokodujemo datotek

               if [ $# -lt 3 ] ; then
                 echo "uporaba: renna z [izraz] [zamenjava] datoteke... "
                 exit 0
               fi

             # odstranimo ostale parametre
               STARO=$1 ; NOVO=$2 ; shift ; shift

             # ta zanka se ponovi za vsako datoteko, ki je bila podana
             # skriptu ter jo preimenuje z uporabo programa 'sed', ki v
             # tekstu iz standardnega vhoda poie izraz in ga zamenja z
             # drugim. Tukaj mu na standardni vhod podamo ime datoteke.

               for datoteka in $*
               do
                 NOVO_IME=`echo ${datoteka} | sed s/${STARO}/${NOVO}/g`
                 mv ${datoteka} $NOVO_IME
               done
             exit 0
             fi

             # e smo prili do sem, to pomeni, da programu ni bila podan
             # noben parameter, zato uporabniku povemo, kako se ga uporablja

             echo "uporaba;"
             echo " renna p [predpona] datoteke.."
             echo " renna k [konnica] datoteke.."
             echo " renna z [izraz] [zamenjava] datoteke.."
             exit 0

             # konano!


12.4 Preimenovalnik datotek (preprost)

     #!/bin/bash
     # preimenuj.sh
     # enostaven preimenovalnik datotek

     kriterij=$1
     izraz=$2
     zamenjava=$3

     for i in $( ls *$izraz* );
     do
         datoteka=$i
         novo_ime=$(echo $i | sed -e "s/$iraz/$zamenjava/")
         mv $datoteka $novo_ime
     done

13. Ko gre kaj narobe (razhroevanje)

13.1 Naini klicanja BASH

   V prvo vrstico skripta napiite

          #!/bin/bash -x

   To bo pri izvajanju izpisalo nekaj koristnih informacij.

14. O tem spisu

   Sporoite  mi  vae predloge/popravke oziroma karkoli bi radi videli v
   tem spisu. Poskusil ga bom posodobiti kakor hitro bo mogoe.

14.1 (brez) jamenja

   Ta spis ne jami esarkoli o emerkoli. In tako dalje.

14.2 Prevodi

   Italijanski: William Ghelfi (wizzy at tiscalinet.it) je tukaj

   Francoski: Laurent Martelli je neznano kje

   Korejski: Minseok Park http://kldp.org

   Korejski: Chun Hye Jin unknown

   panski: neznan http://www.insflug.org

   Domnevam,  da obstaja e ve prevodov, vendar o njih nimam informacij.
   e veste za kaknega, mi to, prosim, sporoite.

14.3 Zahvale

     * Ljudem, ki so ta spis prevedli v druge jezike (prejnje poglavje)
     * Nathanu Hurstu za mnogo popravkov.
     * Jonu Abbottu za pripombe o aritmetinih izrazih
     * Felixu Hudsonu za skript renna
     * Keesu  van  den  Broeku  za  mnoge  popravke  ter  ponovno pisanje
       poglavja o uporabnih ukazih
     * Mike  (pink) je imel nekaj predlogov o iskanju bash in preverjanju
       datotek
     * Fieshu za predlog pri poglavju o zankah
     * Lion  je  predlagal, da omenim pogosto napako (./hello.sh: Command
       not found.)
     * Andreasu Becku za nekaj popravkov in komentarjev.

14.4 Zgodovina

   Vkljueni novi prevodi in nekaj manjih popravkov.

   Dodal poglavje o uporabnih ukazih, ki ga je ponovno napisal Kess.

   Upoteval e nekaj popravkov in predlogov.

   Dodani primeri pri primerjavi nizov.

   v0.8 opustil verzije, domnevam, da je datum dovolj.

   v0.7 Popravki ter napisanih nekaj starih TO-DO.

   v0.6 Manji popravki.

   v0.5 Dodal poglavje o preusmeritvi.

   v0.4  je  izginila s svojega mesta zaradi mojega nekdanjega efa in ta
   spis je nael mesto tam, kjer mora biti: www.linuxdoc.org.

   prej: ne spominjam se, poleg tega pa nisem uporabljal ne rcs ne cvs :(

14.5 e ve virov

   Uvod v bash (pod BE) http://org.laol.net/lamug/beforever/bashtut.htm

   Bourne Shell Programming http://207.213.123.70/book/
