Shell-skripti (bash)
Shell-skripti on tekstitiedosto, joka sisältää luettelon shell-komennoista, ja se suoritetaan ohjelman tavoin jonkin tehtävän tai joukon tehtäviä suorittamiseksi. Shell-skriptin ensisijainen tarkoitus on automatisoida tehtäviä ja säästää aikaa. On tärkeää ymmärtää komentosarjakomentosarjan perusrakenne, koska komentosarjakomentosarjojen avulla ollaan vuorovaikutuksessa laskentaklustereiden kanssa (ks. seuraava luku Grid Engine)
mikä on Bash?
Unixin kaltaisissa järjestelmissä on monia erilaisia komentosarjoja. Bourne Again Shell (Bash) on yksi niistä, se on GNU/Linux-järjestelmien oletusarvoinen komentotulkki. Sillä on joitakin etuja muihin komentosuorittimiin nähden ja se on melko pitkälti standardi komentosuoritin, ja näytämme alla, miten sitä käytetään komentosarjojen kirjoittamiseen.
Yksinkertaisen bash komentosuorittimen komentosarjan kirjoittaminen
Yksinkertainen komentosuorittimen komentosarja on pelkkä komentosarja. Sen näytämme seuraavaksi.
Kirjoitetaan yksinkertainen skripti, joka antaa näytölle ”hello world” komennolla echo
. Tallennamme tekstitiedoston nimellä myScript.sh
#!/bin/bash echo Hello World
Komentosarjan suorittaminen komentosarjan syntaksi:bash your-script-name
. Tapauksessamme kirjoitamme:
$ bash myScript.sh Hello World
monimutkaisempi esimerkki
Kirjoitetaan hieman monimutkaisempi skripti, jossa käytetään useampia shell-komentoja. Skripti käyttää ls
tiedostojen listaamiseen ja käyttää wc -l
-komentoa, joka laskee rivejä tietyssä tiedostossa tai vakiotulossa. Tässä tapauksessa wc -l
laskee rivien määrän ls -l
:n tulosteessa. Kaikki tämä saavutetaan käyttämällä putkea |
.
Skripti.sh:n sisältö:
#!/bin/bash echo here are the list of files ls -l echo The number of files: ls -l | wc -l
Voidaan suorittaa seuraavasti:
$ bash script.sh
muuttujat bash-skripteissä
Muuttujia voi käyttää myös bash-skripteissä. Jotka ovat hyödyllisiä, kun halutaan kaapata välikomentojen tulosteet ja käyttää niitä muiden komentojen suorittamiseen.muuttujille ei ole olemassa tietotyyppejä. Muuttuja bashissa voi sisältää mitä tahansa seuraavista: numeron, merkin tai merkkijonon.
Muuttujaa ei tarvitse ilmoittaa, riittää, että annat arvon sen viitteelle, niin se luodaan.
Luotaan nyt yksinkertainen skripti, jossa on yksi muuttuja. Määritämme Hello world
merkkijonon kyseiselle muuttujalle ja tulostamme kyseisen muuttujan echo
:llä.
#!/bin/bash VAR="Hello world" echo $VAR
Muuttujaa osoittaessamme emme käyttäneet $
-merkkiä, mutta muuttujaa käyttäessämme jouduimme käyttämään $
-merkkiä.
Komentoriviargumentit bash-skripteissä
Skripti voi ottaa vastaan myös komentoriviargumentteja. Tässä muutamme skriptin, joka listaa tiedoston, ottamaan komentoriviargumentin. Argumentti on polku hakemistoon.
Skriptin2 sisältö.sh:
#!/bin/bash VAR= echo here are the list of files ls -l $VAR echo The number of files: ls -l $VAR | wc -l
Skripti suoritetaan näin:
$ bash script2.sh /home/user/project
Argumentit tallennetaan muuttujiin, joiden numero on argumentin mukaisessa järjestyksessä alkaen 1
- Ensimmäinen argumentti:
Tapauksessamme vastaa
/home/user/project
.
Aritmeettiset operaatiot bash-skriptit
Aritmeettiset operaatiot kokonaisluvuilla bashissa tehdään seuraavassa muodossa:
#!/bin/bash x=6 y=2 $((10 - 5)) $((x-y)) echo $((x-y)) echo $((10-5))
Voit myös kopioida ja liittää nämä komennot konsoliin nähdäksesi miten ne toimivat. echo
-komentojen pitäisi tulostaa 4
ja 5
.
Bash-aritmetiikka ei tue liukulukuja (esim. 1.3 -1-operaatio ei toimi bashissa), sinun on käytettävä bc
-komentoa. Katso tästä stackOverflow-esimerkistä esimerkki bc
:n käytöstä.
Looping over files
Jos yrität automatisoida tehtävää bash-skriptauksen avulla, on hyvin todennäköistä, että joudut soveltamaan tiettyjä komentoja jokaiseen hakemistossa olevaan tiedostoon. Tämä voidaan toteuttaa jokerimerkkien*
ja for
silmukoiden avulla. Seuraava skripti tallentaa kaikki hakemistossa /path/to
olevat ’.txt’-tiedostot muuttujaan FILES
. Sitten se laskee jokaisesta tiedostosta rivien määrän ja tulostaa sen komennolla wc -l
.
#!/bin/bash FILES=/path/to/*.txt for f in $FILES do echo "Processing $f file..." # count number of lines and output that for file $f wc -l $f done
Lisää bash-skripteistä
Voit kirjoittaa vieläkin monimutkaisempia shell-skriptejä käyttäen kontrollirakenteita (if/else-, for/while-silmukoita) ja saavuttaa paljon pelkällä shell-skriptaamisella, mutta se ei kuulu tämän dokumentin piiriin. Katso alla olevia linkkejä, jos haluat oppia paremmin kirjoittamaan shell-skriptejä.
- http://www.freeos.com/guides/lsst/
- http://www.tldp.org/LDP/Bash-Beginners-Guide/html/