3 545
muokkausta
(→Joukot: Lisätty huomio siitä, mitä bash tulkitsee ja mikä jää suoritettavalla ohjelmalle) |
(syntaksin värikorostus käyttöön) |
||
Rivi 3: | Rivi 3: | ||
== Alkuun == | == Alkuun == | ||
Skripti aloitetaan rivillä | 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. | 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. | ||
Rivi 10: | Rivi 12: | ||
=== Ensimmäinen skripti === | === Ensimmäinen skripti === | ||
Tehdään aluksi yksinkertainen skripti, joka esittelee muutamia perustoimintoja: | Tehdään aluksi yksinkertainen skripti, joka esittelee muutamia perustoimintoja: | ||
<source lang="bash"> | |||
#!/bin/bash | #!/bin/bash | ||
echo "Hei, `whoami`, mitä kuuluu" | echo "Hei, `whoami`, mitä kuuluu" | ||
echo "Olet hakemistossa $PWD, tiedostolistaus:" | echo "Olet hakemistossa $PWD, tiedostolistaus:" | ||
ls | 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. | 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. | ||
Rivi 25: | Rivi 29: | ||
Viimeisellä rivillä ajetaan normaalisti komentoriviohjelma [[ls]]. Voit myös kokeilla korvata tämän rivin rivillä | Viimeisellä rivillä ajetaan normaalisti komentoriviohjelma [[ls]]. Voit myös kokeilla korvata tämän rivin rivillä | ||
<source lang="bash"> | |||
echo "`ls`" | echo "`ls`" | ||
</source> | |||
Skrpti voitaisiin myös kirjoittaa suoraan komentoriville muodossa | Skrpti voitaisiin myös kirjoittaa suoraan komentoriville muodossa | ||
<source lang="bash"> | |||
echo "Hei, `whoami`, mitä kuuluu"; echo "Olet hakemistossa $PWD, tiedostolistaus:"; ls; | echo "Hei, `whoami`, mitä kuuluu"; echo "Olet hakemistossa $PWD, tiedostolistaus:"; ls; | ||
</source> | |||
== Muuttujat == | == Muuttujat == | ||
Muuttujat määritellään syntaksilla | Muuttujat määritellään syntaksilla | ||
<source lang="bash"> | |||
nimi=arvo | nimi=arvo | ||
</source> | |||
ja niihin viitataan laittamalla muuttujan eteen $ | ja niihin viitataan laittamalla muuttujan eteen $ | ||
<source lang="bash"> | |||
$nimi | $nimi | ||
</source> | |||
Tapauksia, joissa käyttäjän tarkoittama muuttuja on epäselvä, tulee käyttää aaltosulkuja muuttujan ympärillä | Tapauksia, joissa käyttäjän tarkoittama muuttuja on epäselvä, tulee käyttää aaltosulkuja muuttujan ympärillä | ||
<source lang="bash"> | |||
${foo}bar | ${foo}bar | ||
</source> | |||
kun halutaan tulostaa teksti <tt>bar</tt> muuttujan <tt>foo</tt> jälkeen. | 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: | 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 | #!/bin/bash | ||
HEI="Hei, `whoami`, mitä kuuluu?" | HEI="Hei, `whoami`, mitä kuuluu?" | ||
echo $HEI | 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. | 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. | ||
Rivi 49: | Rivi 65: | ||
MUUTTUJA= "moi" | MUUTTUJA= "moi" | ||
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ä: | 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 | numero=43 | ||
</source> | |||
== Ehtolauseet == | == Ehtolauseet == | ||
Ehdollisia rakenteita luodaan bashille if, then, else ja fi -avainsanoilla. Rakenteen syntaksi on seuraava: | Ehdollisia rakenteita luodaan bashille if, then, else ja fi -avainsanoilla. Rakenteen syntaksi on seuraava: | ||
<source lang="bash"> | |||
if [ ehto ] | if [ ehto ] | ||
then | then | ||
Rivi 63: | Rivi 83: | ||
muita lauseita | muita lauseita | ||
fi | fi | ||
</source> | |||
Ehdot merkitään hakasulkeiden sisään esimerkiksi seuraavalla tavalla | Ehdot merkitään hakasulkeiden sisään esimerkiksi seuraavalla tavalla | ||
<source lang="bash"> | |||
#!/bin/bash | #!/bin/bash | ||
if [ $PWD = "/" ] | if [ $PWD = "/" ] | ||
Rivi 72: | Rivi 94: | ||
echo "Skripti suoritetaan hakemistossa $PWD"; | echo "Skripti suoritetaan hakemistossa $PWD"; | ||
fi | fi | ||
</source> | |||
Tässä käytetään vertailuoperaattoria =, joka on tosi, jos merkkijonot ovat samat. Muita vertailuoperaattoreita ovat | Tässä käytetään vertailuoperaattoria =, joka on tosi, jos merkkijonot ovat samat. Muita vertailuoperaattoreita ovat | ||
Rivi 112: | Rivi 135: | ||
Esimerkiksi seuraavat ehdot ovat tosia | Esimerkiksi seuraavat ehdot ovat tosia | ||
<source lang="bash"> | |||
[ 2 -lt 5 ] | [ 2 -lt 5 ] | ||
[ "moi" != "linux" ] | [ "moi" != "linux" ] | ||
[ 54 -ge 53 ] | [ 54 -ge 53 ] | ||
[ -f "/etc/fstab" ] | [ -f "/etc/fstab" ] | ||
</source> | |||
== Silmukat == | == Silmukat == | ||
Rivi 121: | Rivi 146: | ||
For-silmukka on näppärä monessa tapauksessa, tässä esimerkkinä hakemiston kaikkien tiedostojen läpikäynti. | For-silmukka on näppärä monessa tapauksessa, tässä esimerkkinä hakemiston kaikkien tiedostojen läpikäynti. | ||
<source lang="bash"> | |||
for muuttuja in `ls` | for muuttuja in `ls` | ||
do | do | ||
echo $muuttuja | echo $muuttuja | ||
done | 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 | 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:" | echo "Lasketaan kymmeneen:" | ||
for luku in $(seq 10) | for luku in $(seq 10) | ||
Rivi 131: | Rivi 159: | ||
echo $luku | echo $luku | ||
done | 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 | 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 | ||
Rivi 136: | Rivi 165: | ||
=== While === | === 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ä). | 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 ] | while [ ehto ] | ||
do | do | ||
Rivi 147: | Rivi 177: | ||
[[sleep]] 1 | [[sleep]] 1 | ||
done | 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. | 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 === | ||
Until on while:n vastakohta. Until-lauseke jatkaa suoritusta niin kauan kunnes ehto on tosi. | Until on while:n vastakohta. Until-lauseke jatkaa suoritusta niin kauan kunnes ehto on tosi. | ||
<source lang="bash"> | |||
until [ ehto ] | until [ ehto ] | ||
do | do | ||
lauseita | lauseita | ||
done | done | ||
</source> | |||
== Funktiot == | == Funktiot == | ||
Kuten "oikeissa" ohjelmointikielissä, myös bash-skripteissä on mahdollista käyttää funktioita seuraavalla tavalla | Kuten "oikeissa" ohjelmointikielissä, myös bash-skripteissä on mahdollista käyttää funktioita seuraavalla tavalla | ||
< | |||
<source lang="bash"> | |||
#!/bin/bash | #!/bin/bash | ||
function Käyttis { | function Käyttis { | ||
Rivi 166: | Rivi 200: | ||
Käyttis | Käyttis | ||
echo $os | echo $os | ||
</ | </source> | ||
Tulostaisi "Linux". | Tulostaisi "Linux". | ||
Funktio määritellään siis syntaksilla | Funktio määritellään siis syntaksilla | ||
< | <source lang="bash"> | ||
function Funktio { | function Funktio { | ||
#koodi | #koodi | ||
Rivi 178: | Rivi 214: | ||
<pre> | <pre> | ||
Funktio() { ... } | 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>: | 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 | #!/bin/bash | ||
function Käyttis { | function Käyttis { | ||
Rivi 191: | Rivi 229: | ||
Käyttis | Käyttis | ||
echo $os | echo $os | ||
</ | </source> | ||
Tulostaisi "Debian". | Tulostaisi "Debian". | ||