SHELL-SCRIPTIEN HYÖTYKÄYTTÖ
© 1992-1996 Hannu Aronsson haa@iki.fi


Ymmärtämisen kautta tehokäyttöön

Ohjelmointirakenteet

Komentotulkissa on myös oma yksinkertainen ohjelmointikielensä, jonka avulla voidaan komentoja yhdistellä mutkikkaammilla tavoilla "ohjelmiksi", shell-scripteiksi.

#!/bin/sh
# Convert mac text files to unix text files
# Hannu.Aronsson@iki.fi
Huom: Virheiden käsittely puuttuu!

for i
do
   recode latin1:mac "$i"
   tr '\012' '\015' < "$i" > "$i.tmp"   # LF -> CR
   cp "$i.tmp" "$i" # save modes this way
   rm "$i.tmp"
   ls -l "$i"
done
Esimerkki shell-scriptistä

Kovin mutkikkaita ohjelmia ei kannata tehdä shell-scripteinä, mutta pieniin usein toistuviin perustöihin ne ovat varsin käteviä.
    Huomaa, että näitä ohjausrakenteita voi kirjoittaa suoraan komentoriviltäkin, joka on usein kätevää.


SHELL-SCRIPTIT

Unix-komentoja on usein hyvin helppo yhdistellä shell-scripteiksi, jolloin vähällä vaivalla saa suhteellisen käteviä lisätyökaluja rakennettua.
    Komentotulkki (shell) on myös ohjelmointikieli, joskin aika yksinkertainen. Jos osaa käyttää komentoja, on shell-scriptien tekeminen aika helppoa. Muut hienommat työkalut (kuten Perl) vaativat yleensä erikseen opettelua.
    Unix osaa automaattisesti ajaa scriptin sen tulkitsemisen osaavalla ohjelmalla, jos tekstitiedoston ensimmäinen rivi on muotoa #!/polku/ohjelmaan . Tällöin ko. scriptitiedoston "ajaminen" tekee saman, kuin jos olisi antanut komennon /polku/ohjelmaan scriptitiedosto. Tämä on erittäin kätevää, komennot voivat olla joko scriptejä tai "oikeita" komentoja, mutta käyttäjän ei tarvitse sitä tietää.

Tehokkuudesta

Ohjelmoidessa kannattaa pitää mielessä myös se, että ohjelman (tai scriptin) tekemiseen menee aikaa. Ohjelmoijan, työntekijän aika on nykyään kalliimpaa kuin tietokoneen aika.
    Vaikka joskus shell-scripti on ehkä hitaampi kuin erityinen ohjelma, sen tekemiseen menee niin paljon vähemmän aikaa, että se kannattaa.
    Esimerkiksi C-kielellä ohjelmoidessa paljon aikaa menee tylsien asioiden tekemiseen (esim. muistitilan riittävyyden varmistamiseen jokaisen pienenkin operaation yhteydessä). Yleensä scripteissä (tai scriptikielissä, esim. Awk tai Perl) ei tarvitse tällaisista pikkuasioista murehtia, joten voi keskittyä olennaiseen.
    Monet työkaluohjelmista mitä scripteissä käytetään ovat myös aika tehokkaita, näin niiden kehittämiseen mennyt työ saadaan omassa scriptissä käyttöön, ja vältytään itse uudelleen keksityiltä neliskulmaisilta pyöriltä.

Perustyökalut shell-scripteissä

Shellin sisäänrakennetut toiminnot: :, ., break, continue, cd, eval, exec, exit, export, login, newgrp, read, readonly, set, shift, times, trap, umask, wait

Testit



if komento
then
  komentoja
else
  komentoja
fi
If-then-else, jos-sitten-muuten testi



case "$foo" in
  foo*) komentoja ;;
  bar*) komentoja ;;
  a|b)  komentoja ;;
  *)    komentoja ;;
esac
case-valinta

Silmukat



for muuttuja in arvo1 arvo2 ...
do
  komentoja
done
for-silmukka, käy eri arvot läpi



while komento
do
  komentoja
done
while-silmukka, tee niin kauan kuin



#!/bin/sh
#
# Tee kuvista lista jossa on thumbnailit html-sivuna 
# jolla on sitten linkit oikeisiin kuviin. Oletetaan 
# että kuvat ovat tässä samassa hakemistossa.
#
# Hannu.Aronsson@iki.fi
#
 
echo "<HTML>
<HEAD><TITLE>Peukalonjäljet</TITLE></HEAD>
<BODY BGCOLOR=\"#FFFFFF\">
<H1>Peukalonjäljet</H1>
"                               # HTML aloitus
  
mkdir thumb 2>/dev/null         # Tehdään thumb-hakemisto
  
for i                           # Joka argumentille
do
    THUMBNAME="thumb/$i"        # Nimi thumbnailille
  
    case "$i" in                # Kuvan tyyppi
    *.gif)  AVAUS="giftopnm"    # GIF
            ;;
    *.jpg|*.jpeg)               # JPEG
            AVAUS="djpeg"
            ;;
    *)                          # Tuntematon
            echo "Unknown image extension $i" >&2
            exit 1
            ;;
    esac
  
    $AVAUS $i |                 # Tehdään PPM kuva
    pnmscale -width 100 |       # Skaalataan leveys
    ppmquant 256 |              # Vähennetään värejä
    ppmtogif > $THUMBNAME       # Tehdään GIFfi
  
    echo "<P><A HREF=\"$i\">
        <IMG SRC=\"$THUMBNAME\"> $THUMBNAME
        </A>"
  
done
  
echo "</BODY></HTML>"           # Lopuksi vielä htmlää
  
# EOF
Esimerkki Shell-scriptistä

Perl?

Jos työtä ei saa tehtyä hyvin yksinkertaisella shell-scriptillä, kannattaa nykyään heti jo harkita perl-työkalun käyttöä, jolla voi tehdä hyvinkin mutkikkaita "scriptintapaisia" ohjelmia.
    Tosin Perl on erilainen, joiltakin osin aika kryptinen työkalu ja vaatii jonkinlaisia ohjelmointitaitoja tai suurta innostusta.

C-ohjelma?

Unixin perusohjelmointiympäristö on tietenkin C-ohjelmointikieli. C-kieli on tehokas (jos ohjelmoija osaa ohjelmoida), suhteellisen alhaisen tason kieli, missä ohjelmoijalla on suuri vapaus, mutta myös suuri vastuu. C-ohjelmointi on yleensä hankalaa, siksi monet mutkikkaammatkin pulauttimet tehdään usein mielummin esim. Perl moottorisahatyökalulla.

Hannu Aronsson haa@iki.fi www.iki.fi/haa
© 1992-1996 Hannu Aronsson haa@iki.fi