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