Ero sivun ”Bash-skriptaus” versioiden välillä

Siirry navigaatioon Siirry hakuun
556 merkkiä lisätty ,  31. elokuuta 2008
syntaksin värikorostus käyttöön
(→‎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ä
#!/bin/bash
<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
<pre>
 
<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
</pre>
</source>
 
Tulostaisi "Linux".  
Tulostaisi "Linux".  


Funktio määritellään siis syntaksilla
Funktio määritellään siis syntaksilla
<pre>
<source lang="bash">
 
function Funktio {
function Funktio {
  #koodi
  #koodi
Rivi 178: Rivi 214:
<pre>
<pre>
Funktio() { ... }
Funktio() { ... }
</pre>
 
</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>:
<pre>
 
<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
</pre>
</source>
 
Tulostaisi "Debian".
Tulostaisi "Debian".


Navigointivalikko