Ero sivun ”Bash-skriptaus” versioiden välillä
Siirry navigaatioon
Siirry hakuun
Kumottu muokkaus #23482, jonka teki ARTTUSN WIHOWIIMEINEN MARSSI TÄYTIN TOIVEENNE PÄÄSETTE NYT EROON MUSTA!!!!!!!! ([[User talk:ARTTUSN WIH
ARTTUSN WIHOWIIMEINEN MARSSI TÄYTIN TOIVEENNE PÄÄSETTE NYT EROON MUSTA!!!!!!!! (keskustelu | muokkaukset) (Ak: Sivun sisältö korvattiin sisällöllä ”HYVÄSTI NUSSIJAT”) |
(Kumottu muokkaus #23482, jonka teki ARTTUSN WIHOWIIMEINEN MARSSI TÄYTIN TOIVEENNE PÄÄSETTE NYT EROON MUSTA!!!!!!!! ([[User talk:ARTTUSN WIH) |
||
Rivi 1: | Rivi 1: | ||
Komentorivi on jo yksinään [[Komentorivin perusteet|monipuolinen]] työkalu, mutta skriptien avulla on mahdollista toteuttaa huomattavasti monipuolisempia prosesseja pienellä vaivalla. Tässä oppaassa käsitellään skriptien kirjoittamista [[bash]]-[[komentotulkki|komentotulkille]]. | |||
== Alkuun == | |||
Skripti aloitetaan rivillä | |||
<source lang="bash"> | |||
#!/bin/bash | |||
</source> | |||
Joka kertoo, että skripti suoritetaan käyttäen bashia riippumatta siitä, mitä komentotulkkia käyttäjä käyttää ajaessaan skriptin. Huomaa, että vaikka rivi alkaa #-merkillä, se ei ole kommentti. Muualla skriptissä #:llä alkavat rivit ovat kommentteja, eikä niitä huomioida. | |||
Skriptejä ei kuitenkaan ole pakko kirjoittaa erilliseen tiedostoon, vaan ne voi kirjoittaa myös suoraan komentoriville. Tällöin eri komentojen väliin laitetaan erottimeksi puolipiste (;). | |||
=== Ensimmäinen skripti === | |||
Tehdään aluksi yksinkertainen skripti, joka esittelee muutamia perustoimintoja: | |||
<source lang="bash"> | |||
#!/bin/bash | |||
echo "Hei, `whoami`, mitä kuuluu" | |||
echo "Olet hakemistossa $PWD, tiedostolistaus:" | |||
ls | |||
</source> | |||
Kuten huomaat, skripteissä käytetään tavallisia komentorivikomentoja, jotka sitten suoritetaan järjestyksessä. Toisaalta kuten myöhemmin huomaamme, skriptit tarjoavat paljon enemmän mahdollisuuksia kuin pelkkä komentojen näpyttely konsoliin. | |||
Tallenna skripti vaikka nimellä <tt>eka.sh</tt> (sh-päätettä käytetään yleensä skriptien kanssa), anna sille [[chmod|suoritusoikeudet]] ja aja skripti, jolloin tulostus on suunnilleen seuraavanlainen: | |||
Hei, käyttäjä, mitä kuuluu | |||
Olet hakemistossa /home/kayttaja/ohjelmointi/skriptit, tiedostolistaus: | |||
eka.sh | |||
Esimerkistä nähdään heti muutama perusasia. Ensinnäkin toisella rivillä käytetään ohjelmaa [[whoami]], joka tulostaa käyttäjänimen. Kun ohjelma on `-merkkein välissä, kyseiseen kohtaan "kopioidaan" ajetun ohjelman tuloste. | |||
Toisella rivillä käytetään muuttujaa. Muuttujien edessä on dollarimerkki ($), ja niitä voidaan tunkea vaikka merkkijonojen (jotka erotetaan lainausmerkillä) sisälle. Muuttujia käsitellään tarkemmin myöhemmin. Esimerkissä käyttämämme muuttuja <tt>$PWD</tt> on [[ympäristömuuttuja]], jonka arvona on aina se hakemisto, jossa käyttäjä on. Voit kokeilla tätä esimerkiksi kirjoittamalla komentoriville komennon <tt>echo $PWD</tt>. | |||
Viimeisellä rivillä ajetaan normaalisti komentoriviohjelma [[ls]]. Voit myös kokeilla korvata tämän rivin rivillä | |||
<source lang="bash"> | |||
echo "`ls`" | |||
</source> | |||
Skrpti voitaisiin myös kirjoittaa suoraan komentoriville muodossa | |||
<source lang="bash"> | |||
echo "Hei, `whoami`, mitä kuuluu"; echo "Olet hakemistossa $PWD, tiedostolistaus:"; ls; | |||
</source> | |||
== Muuttujat == | |||
Muuttujat määritellään syntaksilla | |||
<source lang="bash"> | |||
nimi=arvo | |||
</source> | |||
ja niihin viitataan laittamalla muuttujan eteen $ | |||
<source lang="bash"> | |||
$nimi | |||
</source> | |||
Tapauksia, joissa käyttäjän tarkoittama muuttuja on epäselvä, tulee käyttää aaltosulkuja muuttujan ympärillä | |||
<source lang="bash"> | |||
${foo}bar | |||
</source> | |||
kun halutaan tulostaa teksti <tt>bar</tt> muuttujan <tt>foo</tt> jälkeen. | |||
Ensimmäisen skriptimme tapauksessa käytimme jo ympäristömuuttujaa $PWD echo:n kanssa. Tehdäänpä samantyyppinen skripti nyt käyttäen itse määrittelemäämme muuttujaa: | |||
<source lang="bash"> | |||
#!/bin/bash | |||
HEI="Hei, `whoami`, mitä kuuluu?" | |||
echo $HEI | |||
</source> | |||
Kuten huomaat, kun muuttujaan sijoitetaan arvo, voidaan käyttää samoja "kikkoja" kuin muuallakin skriptissä, esimerkiksi tässä tapauksessa sijoitamme muuttujaan merkkijonon jonka sisällä on ohjelman <tt>whoami</tt> tuloste. | |||
Huomaa, että yhtäsuuruusmerkin on oltava kiinni muuttujan nimessä ja arvossa, eli seuraavat muodot eivät käy: | |||
MUUTTUJA = "terve vaan" | |||
MUUTTUJA= "moi" | |||
MUUTTUJA ="moi" | |||
Lisäksi muuttujaan sijoitettavan arvon on oltava lainausmerkkien sisällä, jos siihen kuuluu välilyönti. Yksittäisen sanan tai numeron voi sijoittaa ilman lainausmerkkejä: | |||
<source lang="bash"> | |||
numero=43 | |||
</source> | |||
== Ehtolauseet == | |||
Ehdollisia rakenteita luodaan bashille if, then, else ja fi -avainsanoilla. Rakenteen syntaksi on seuraava: | |||
<source lang="bash"> | |||
if [ ehto ] | |||
then | |||
lauseita | |||
elif [ toinen ehto ] | |||
then | |||
lauseita | |||
else | |||
muita lauseita | |||
fi | |||
</source> | |||
Ehdot merkitään hakasulkeiden sisään esimerkiksi seuraavalla tavalla | |||
<source lang="bash"> | |||
#!/bin/bash | |||
if [ $PWD = "/" ] | |||
then | |||
echo "Tämä skripti suoritetaan juurihakemistossa"; | |||
else | |||
echo "Skripti suoritetaan hakemistossa $PWD"; | |||
fi | |||
</source> | |||
Tässä käytetään vertailuoperaattoria =, joka on tosi, jos merkkijonot ovat samat. Muita vertailuoperaattoreita ovat | |||
{|<!--taulukon määrite--> {{siistitaulukko}} | |||
|- | |||
! Operaattori | |||
! Kuvaus | |||
|- | |||
<!-- taulukko alkaa tästä --> | |||
| -n || Pituus ei ole 0 | |||
|- | |||
| -z || Pituus on 0 | |||
|- | |||
| -d || Hakemisto on olemassa | |||
|- | |||
| -f || Tavallinen tiedosto on olemassa | |||
|- | |||
| -r || Onko tiedostoon lukuoikeus | |||
|- | |||
| -w || Onko tiedostoon kirjoitusoikeus | |||
|- | |||
| -x || Onko tiedostoon ajo-oikeus | |||
|- | |||
| -eq || Kokonaisluvut ovat yhtäsuuret (a = b) | |||
|- | |||
| -ne || Kokonaisluvut eivät ole yhtä suuret (a != b) | |||
|- | |||
| = || Merkkijonot ovat samat (myös ==) | |||
|- | |||
| != || Merkkijonot eivät ole samat | |||
|- | |||
| -lt || Kokonaisluku on pienempi kuin toinen | |||
|- | |||
| -gt || Kokonaisluku on suurempi kuin toinen (a > b) | |||
|- | |||
| -le || Kokonaisluku on pienempi tai yhtäsuuri kuin toinen (a <= b) | |||
|- | |||
| -ge || Kokonaisluku on suurempi tai yhtäsuuri kuin toinen (a >= b) | |||
|} | |||
Esimerkiksi seuraavat ehdot ovat tosia | |||
<source lang="bash"> | |||
[ 2 -lt 5 ] | |||
[ "moi" != "linux" ] | |||
[ 54 -ge 53 ] | |||
[ -f "/etc/fstab" ] | |||
</source> | |||
== Silmukat == | |||
=== For === | |||
For-silmukka on näppärä monessa tapauksessa, tässä esimerkkinä hakemiston kaikkien tiedostojen läpikäynti. | |||
<source lang="bash"> | |||
for muuttuja in `ls` | |||
do | |||
echo $muuttuja | |||
done | |||
</source> | |||
Silmukassa suoritettavat rivit laitetaan siis sanojen <tt>do</tt> ja <tt>done</tt> väliin. Laskurimuuttujaan sijoitetaan vuorotellen <tt>in</tt>:n jälkeen olevat sanat, esimerkiksi tässä tapauksessa konennon [[ls]] tuloste (eli hakemistossa olevien tiedostojen nimet). Ohjelman tuloste voidaan merkitä myös seuraavasti: <tt>$(komento)</tt>. Jos silmukalla on käytävä läpi kaikki kokonaisluvut tietyltä väliltä, voi käyttää komentoa [[seq]], joka tulostaa kokonaisluvut väliltä 1-annettu parametri. Esimerkiksi | |||
<source lang="bash"> | |||
echo "Lasketaan kymmeneen:" | |||
for luku in $(seq 10) | |||
do | |||
echo $luku | |||
done | |||
</source> | |||
Läpi käytävä joukko voidaan merkitä myös syntaksilla <tt>{alku..loppu}</tt>. Jos esimerkiksi halutaan käydä läpi kaikki merkit c-o, kokeile vaikka kirjoittaa | |||
for muuttuja in {c..o}; { echo -n "$muuttuja "; sleep 1;} | |||
=== While === | |||
While suorittaa lausekkeita niin kauan kuin ehto on tosi. Kun ehto on epätosi poistutaan loopista joilloin skriptin suoritus jatkuu seuraavalta loogiselta riviltä (while-lausekkeen jälkseiseltä riviltä). | |||
<source lang="bash"> | |||
while [ ehto ] | |||
do | |||
lauseita | |||
done | |||
Esimerkki: | |||
while [ -f "testi" ] | |||
do | |||
echo "Tiedosto on olemassa." | |||
sleep 1 | |||
done | |||
</source> | |||
Edellä oleva skripti tarkistaa, onko samassa hakemistossa oleva tiedosto <tt>testi</tt> olemassa. Tätä jatketaan niin kauan kunnes tiedostoa ei enää ole. | |||
=== Until === | |||
Until on while:n vastakohta. Until-lauseke jatkaa suoritusta niin kauan kunnes ehto on tosi. | |||
<source lang="bash"> | |||
until [ ehto ] | |||
do | |||
lauseita | |||
done | |||
</source> | |||
== Funktiot == | |||
Kuten "oikeissa" ohjelmointikielissä, myös bash-skripteissä on mahdollista käyttää funktioita seuraavalla tavalla | |||
<source lang="bash"> | |||
#!/bin/bash | |||
function Käyttis { | |||
os="Linux" | |||
} | |||
os="Windows" | |||
#Kutsutaan funktiota | |||
Käyttis | |||
echo $os | |||
</source> | |||
Tulostaisi "Linux". | |||
Funktio määritellään siis syntaksilla | |||
<source lang="bash"> | |||
function Funktio { | |||
#koodi | |||
} | |||
</source> | |||
Jos halutaan skriptin toimivan myös [[Sh]]-komentotulkkia käytettäessä, funktion kanssa on käytettävä syntaksia | |||
<source lang="bash"> | |||
Funktio() { ... } | |||
</source> | |||
Jos muuttujia ei funktiossa erikseen määritellä yksityisiksi, ne ovat julkisia. Eli kun esimerkkiskriptissämme muutimme muuttujan $os arvoa funktiossa, tämä muutos näkyi myös funktion ulkopuolella. Muuttuja voidaan määritellä yksityiseksi avainsanalla <tt>local</tt>: | |||
<source lang="bash"> | |||
#!/bin/bash | |||
function Käyttis { | |||
local os # os paikallinen muuttuja | |||
os="Gentoo" | |||
} | |||
os="Debian" | |||
#Kutsutaan funktiota | |||
Käyttis | |||
echo $os | |||
</source> | |||
Tulostaisi "Debian". | |||
== Vinkkejä == | |||
=== Joukot === | |||
Käytimme jo aiemmin merkintätapaa <tt>{1..4}</tt> merkitsemään joukkoa, johon kuuluu kaikki välin merkit (esimerkissä 1,2,3,4). Tämä ominaisuus on kuitenkin monipuolisempi. Esimerkiksi jos haluamme luoda Matille, Martalle ja Jormalle työ- ja kotihakemistot, voisimme kirjoittaa lyhyesti näin | |||
mkdir {ma{ti,rta},jorma}n_{työ,koti}hakemisto | |||
Jolloin luotaisiin hakemistot matin_työhakemisto, matin_kotihakemisto, martan_työhakemisto, martan_kotihakemisto, jorman_työhakemisto ja jorman_kotihakemisto. | |||
Puretaanpa hieman tuota komentoa. <tt>ma{ti,rta}</tt> tuottaa sanat mati ja marta. Kun joukon merkinnän ulkopuolella on n, liitetään jokaisen joukon sisällä olevan alkion perään n, jolloin alaviivaa edellä oleva osuus tuottaa sanat matin, martan ja jorman. Jälkimmäinen osuus toimii samalla tavalla, sanojen työ ja koti perään liitetään sana hakemisto. Näin saamme lyhyellä komennolla aikaan paljon. | |||
Tärkeä huomio on, että <tt>{}</tt>-joukon tulkitsee bash-komentotulkki eikä ohjelma, jonka yhteydessä <tt>{}</tt>-joukkoa käytetään. Käytännössä tämä tarkoittaa, että ensin bash ikään kuin avaa joukon ja vasta sen jälkeen suorittaa komentorivin. Tässä esimerkissä <tt>mkdir</tt>-ohjelma saa parametreikseen vain listan luotavista hakemistoista eikä <tt>mkdir</tt> edes tiedä, että käytettiin <tt>{}</tt>-joukkoa: | |||
mkdir matin_työhakemisto matin_kotihakemisto martan_työhakemisto martan_kotihakemisto jorman_työhakemisto jorman_kotihakemisto | |||
Tässä huomataan myös, että komentoja voi käyttää aivan normaalien [[Komentorivikomennot|komentoriviohjelmien]] kanssa, sillä bash käsittelee syötteen, ja suorittaa skriptit antaen ohjelmalle syötteenä skriptin tulosteen. | |||
=== Hyödyllisiä ohjelmia === | |||
Unixin filosofian mukaisesti Linuxissa on lukuisia ohjelmia, jotka hoitavat jonkin yksittäisen tehtävän ja tekevät sen hyvin. Näitä pikkuohjelmia käytetäänkin usein skripteissä hoitamaan erilaisia tehtäviä. | |||
Kaikista Linux-järjestelmistä löytyviä ohjelmia on listattu luokkaan [[:Luokka:Komentorivin perustyökalut|Komentorivin perustyökalut]]. Näitä ohjelmia kannattaa selailla. Komentoriviohjelmia on listattu käyttötarkoituksen mukaan myös artikkelissa [[komentorivikomennot]] | |||
== Katso myös == | |||
*[[Komentorivin perusteet]] | |||
*[[Komentorivivinkkejä]] | |||
==Aiheesta muualla== | |||
*[http://tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide] - laaja englanninkielinen opas bash-skriptaukseen | |||
*[http://www.panix.com/~elflord/unix/bash-tute.html Pikaopas bash-skriptaukseen] (englanniksi) | |||
[[Luokka:Komentorivi]] | |||
[[Luokka:Ohjeet]] |