FLOSS Manuals

 English |  Español |  Français |  Italiano |  Português |  Русский |  Shqip

Komentorivin perusteet

Skriptaus

Skriptaaminen

 Jos sinulla on kokoelma komentoja, jotka tahtoisit suorittaa yhdessä, voit yhdistää ne skriptiin eli komentosarjaan, ja suorittaa ne kaikki kerralla. Voit myös antaa skripteille argumentteja, jotta se voi toimia eri tiedostojen tai muun sisääntulon pohjalta.  

 

Kuten elokuvan käsikirjoitusta lukeva näyttelijä, tietokone lukee jokaisen komennon komentotulkkisi komentosarjassa, odottamatta sinua kuiskaamaan jokaista komentoa sen korvaan. Skripti on helppo tapa:

  • Välttyä kirjoittamasta komentoja, jotka ajaisit usein sarjassa.
  • Muistaa monimutkaisia komentoja, jotta et joudu etsimään, tai unohda, tiettyä syntaksia joka kerta sitä käyttäessäsi.
  • Käyttää hallintarakenteita, kuten silmukoita ja tapauslauseita, jotta skriptisi voivat tehdä monimutkaisia toimenpiteitä. Näiden rakenteiden kirjoittaminen skriptiin tekee niistä mukavampia kirjoittaa ja helpompia lukea.

Sanotaanpa, että sinulla on kokoelma kuvia (esimerkiksi digitaalikamerasta) ja tahdot tehdä niistä esikatselukuvia. Avattuasi satoja kuvia kuvankäsittelyohjelmassasi päätät tehdä homman nopeasti komentoriviltä. Ja koska joudut ehkä tekemään saman homman tulevaisuudessa joudut kirjoittamaan komentosarjan. Tällöin esikatselukuvien tekeminen vaatii sinua kirjoittamaan vain kaksi komentoa:

$ cd kuvat/digikamera/lomakuvat_maaliskuu_2009 
$ tee_esikatselukuvat.sh

Seuraava komento, tee_esikatselukuvat.sh, on skripti, joka tekee työt. Se voisi näyttää suunnilleen tältä:

#!/bin/bash
mkdir esikatselu
cp *.jpg esikatselu
cd esikatselu
mogrify -resize 400x300 *.jpg

Ensimmäinen rivi ei ole pakollinen. Ensimmäinen ristikkomerkki (#) muuttaa sen kommentiksi, jonka pääte jättää huomiotta ajaessaan skriptiä. Se on kuitenkin käyttökelpoinen rivi, sillä ajaessasi ohjelman rivi osoittaa, että /bin/bash -ohjelma pitäisi kutsua ajamaan skripti. Tämä rivi on myös hyödyllistä dokumentaatiota kaikille, jotka ihmettelevät mitä tiedostossa on. 

Jokainen seuraavista riveistä on komento. Olemme nähneet kolme niistä aiemmin: mkdir, cp ja cd. Viimeinen komento, mogrify, on ohjelma, joka voi muuttaa kuvien kokoa (ja tehdä sen lisäksi paljon muita asioita). Lue sen opassivu oppiaksesi siitä lisää. 

Skriptien muuttaminen suoritettaviksi

Tehdäksesi skriptin jollaisen juuri näytimme, avaa suosikkitekstieditorisi ja kirjoita komennot, jotka tahtoisit suorittaa. Voit kirjoittaa monta komentoa yhdelle riville, kunhan laitat puolipisteen jokaisen komennon jälkeen, jotta pääte tietää, että uusi komento alkaa.

Tallenna skripti. Yksi yleinen käytäntö on .sh -loppupäätteen käyttö - esimerkiksi tee_esikatselukuvat.sh.

On vielä yksi askel ennen kuin voit suorittaa skriptin: sen täytyy olla suoritettava tiedosto. Muista, että käyttöoikeuksia antaessasi oikeus ajaa tiedosto on yksi oikeuksista, joka tiedostolla voi olla, joten voit tehdä skriptistä ajettavan antamalla oikeuden execute (x). Seuraava komento antaa kenelle tahansa käyttäjälle oikeuden ajaa skripti: 

 chmod +x tee_esikatselukuvat.sh

Koska tahdot varmaankin käyttää skriptiä usein, voi olla hyvä idea tarkastaa PATH ja lisätä skripti yhteen sen hakemistoista (esimerkiksi /home/jdoe/bin on hyvä valinta tässä näytetyn PATH-tiedon perusteella).

$ echo $PATH
/usr/bin:/usr/local/bin:/home/jdoe/bin

Yksinkertaista testaamista varten voit suorittaa skriptin näin, jos olet hakemistossa, joka sisältää sen:

$ ./tee_esikatselukuvat.sh

Mihin tarvitset edeltävää polkua ./? Koska useimmat käyttäjät eivät ole asettaneet nykyistä hakemistoaan PATH -ympäristömuuttujiinsa. Voit lisätä sen, mutta monet käyttäjät pitävät sitä turvallisuusriskinä.

Voit myös suorittaa skriptin, ilman että sen suorituskäyttöoikeus olisi asetettu, antamalla sen parametrinä komentotulkille:

 bash tee_esikatselukuvat.sh

Lisää hallintaa

Komentotulkki tarjoaa mahdollisuuden tehdä valintoja skriptissä ja suorittaa komennot monta kertaa eri sisääntuloilla. Tässä suhteessa komentotulkki on oikeastaan ohjelmointikieli ja mukava tapa tutustua ohjelmointikielen tarjoamiin tehokkaisiin ominaisuuksiin. Näytämme tässä perusteet komentotulkin tarjoamista hallintalauseista.

if 

Tämä komento esiteltiin jo virheiden tarkistusta käsittelevässä osassa, mutta tarkastelemme sitä uudestaan tässä. if tarkoittaa jos ja se toimii aikalailla kuten olettaisit, joskin sen syntaksi on hieman erilainen kuin muissa kielissä. Se noudattaa tätä rakennetta: 

if [ testiehto ]
then
  tee jotain
else
  tee jotain muuta
fi

Luet oikein: rakenne täytyy lopettaa avainsanalla fi.  Osa else on vaihtoehtoinen. Varmista, että jätät tilaa aloitus- ja lopetushakasulkujen sisälle, muuten if ilmoittaa syntaksivirheestä.

Jos tahdot tutkia voitko lukea tiedoston, voit kirjoittaa tällaisen ohjelman:

if [ -r /home/joe/salatieto.txt ]
then
    echo "Voit lukea tiedoston"
else
    echo "Et voi lukea tiedostoa!"
fi

 

if tarjoaa joukon erilaisia tarkastuksia. Voit laittaa minkä tahansa joukon komentoja testiehdoksi, mutta useimmat if-lauseet käyttävät hakasulkusyntaksin tarjoamia testejä. Nämä ovat itse asiassa synonyymi komennolle test. Joten ensimmäinen rivi edellisessä esimerkissä olisi yhtä hyvin voitu kirjoittaa seuraavasti: 

if test -r /home/joe/salatieto.txt

Tietoja testeistä kuten -r löytyy komennon test opassivulta. Kaikkia testioperaattoreita voidaan käyttää hakasuluissa, kuten me olemme tehneet.

Joitain hyödyllisiä test -operaattoreita ovat:

-r Tiedosto on luettava
-x Tiedosto on suoritettava
-e Tiedosto on olemassa
-d Tiedosto on olemassa ja hakemisto

Näitä on paljon enemmänkin, ja voit jopa testata useampia ehtoja samaan aikaan. Katso komennon test opassivua. 

while (ja until)

while on silmukkarakenne. Se käy kierroksia läpi, kunnes sen testiehdot eivät enää ole totta. Se ottaa seuraavan muodon:

while testiehto
do
  askel1
  askel2
  ...
done

Voit luoda myös silmukoita, jotka toimivat, kunnes käyttäjä keskeyttää ne. Tässä on yksi tapa (ehkei kuitenkaan paras mahdollinen) katsoa kuka on kirjautunut järjestelmääsi 30 sekunnin välein:

while true
do
    who
    sleep 30
done

Tämä ei ole tyylikästä, koska käyttäjän täytyy painaa CTRL-C tai tappaa ohjelma jollain muulla tavalla. Break-komennolla voit kirjoittaa silmukan, joka loppuu kohdatessaan ehdon. Esimerkiksi seuraava skripti käyttää komentoa read (joka on erittäin hyödyllinen interaktiivisissa skripteissä) lukeakseen rivin syötettä käyttäjältä. Tallennamme syötteen muuttujaan userinput ja tarkastamme sen seuraavalla rivillä. Skripti käyttää jo näkemäämme if-komentoa while-blokin sisällä, mikä antaa meidän päättää koska lopetamme while-blokin. Komento break päättää while-blokin ja jatkaa kohti skriptin loppua (jota emme näe tässä). Huomaa, että käytämme kahta testiä valitsimella -o, mikä merkitsee "tai". Käyttäjä voi kirjoittaa Q joko isoin tai pienin kirjaimin lopettaakseen ohjelman.

while true
do
  echo "Kirjoita käsiteltävä syöte (kirjoita Q lopettaaksesi)"
  read userinput

  if [ $userinput == "q" -o $userinput == "Q" ]
  then
    break
  fi

  käsittele syöte...

done

until toimii täsmälleen samalla tavalla, paitsi että silmukka toimii, kunnes testiehto on totta. 

case

case on skriptin tapa vastata pieneen joukkoon ehtoja. Se toimii samalla tavalla kuin muiden ohjelmointikielten case-lauseet, tosin sillä on oma omituinen syntaksinsa, joka esitellään parhaiten esimerkin avulla.

user=`whoami` # laittaa skriptin suorittavan käyttäjän käyttäjänimen
              # muuttujaan $user.
case $user in
    joe)
        echo "Hei Joe. Tiedän että tahtoisit tietää kellonajan, joten näytän sen alla."
        date
        ;;
    amy)
        echo "Hyvää päivää, Amy. Tässä on tehtävälistasi."
        cat /home/amy/amy-todo.txt
        ;;
    sam|tex)
        echo "Hei hemmo. Älä unohda katsoa järjestelmäkuormitusta. Nykyinen järjestelmäkuormitus on:"
        uptime
        ;;
    *)
        echo "Tervetuloa, kuka tahansa oletkin. Töihin siitä."
        ;;
esac

Jokaista tapausta täytyy seurata merkki ), jonka jälkeen tulee uusi rivi, jonka jälkeen lista otettavista askelista, sitten puolipiste tuplana (;;). Ehtoon "*)" sopii kaikki, aivan kuin default -avainsanaan joidenkin kielten case-rakenteissa. Jos muut tapaukset eivät sovi, tämä lista komentoja suoritetaan. Lopulta avainsana esac lopettaa case-lauseen. Huomaaa, että näytetyssä esimerkissä on tapaus, joka sopii sekä merkkijonoon "sam" että "tex". 

for

for on käyttökelpoinen tapa käydä läpi listaa. Se voi olla mikä tahansa merkkijonojen lista, mutta se on erityisen hyödyllinen käytäessä läpi tiedostolistaa. Seuraava esimerkki käy läpi kaikki tiedostot hakemistossa myfiles ja luo jokaisesta varmuuskopion. (Se tukehtuisi hakemistoihin, mutta pidetäänpä esimerkki yksinkertaisena, eikä testata onko tiedosto hakemisto.)

for filename in myfiles/*
do
    cp $filename $filename.bak
done

Kuten mikä tahansa muuttujan luova komento, ensimmäinen komento for-blokissa asettaa muuttujan nimeltä filename ilman dollarimerkkiä.

 

There has been error in communication with Booktype server. Not sure right now where is the problem.

You should refresh this page.