Muokataan sivua Bash-skriptaus
Siirry navigaatioon
Siirry hakuun
Kumoaminen voidaan suorittaa. Varmista alla olevasta vertailusta, että haluat saada aikaan tämän lopputuloksen, ja sen jälkeen julkaise alla näkyvät muutokset.
Nykyinen versio | Oma tekstisi | ||
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 [[ | 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 == | == Alkuun == | ||
Skripti aloitetaan rivillä | Skripti aloitetaan rivillä | ||
#!/bin/bash | |||
#!/bin/bash | |||
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 14: | Rivi 10: | ||
=== Ensimmäinen skripti === | === Ensimmäinen skripti === | ||
Tehdään aluksi yksinkertainen skripti, joka esittelee muutamia perustoimintoja: | Tehdään aluksi yksinkertainen skripti, joka esittelee muutamia perustoimintoja: | ||
#!/bin/bash | |||
#!/bin/bash | echo "Hei, `whoami`, mitä kuuluu" | ||
echo "Hei, | echo "Olet hakemistossa $PWD, tiedostolistaus:" | ||
echo "Olet hakemistossa $ | ls | ||
ls | |||
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 26: | Rivi 20: | ||
Olet hakemistossa /home/kayttaja/ohjelmointi/skriptit, tiedostolistaus: | Olet hakemistossa /home/kayttaja/ohjelmointi/skriptit, tiedostolistaus: | ||
eka.sh | 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 | 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>. | 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ä | Viimeisellä rivillä ajetaan normaalisti komentoriviohjelma [[ls]]. Voit myös kokeilla korvata tämän rivin rivillä | ||
echo "`ls`" | |||
echo "`ls`" | |||
Skrpti voitaisiin myös kirjoittaa suoraan komentoriville muodossa | |||
echo "Hei, `whoami`, mitä kuuluu"; echo "Olet hakemistossa $PWD, tiedostolistaus:"; ls; | |||
echo "Hei, `whoami`, mitä kuuluu"; echo "Olet hakemistossa $PWD, tiedostolistaus:"; ls; | |||
== Muuttujat == | == Muuttujat == | ||
Muuttujat määritellään syntaksilla | Muuttujat määritellään syntaksilla | ||
nimi=arvo | |||
nimi=arvo | ja niihin viitataan syntaksilla | ||
$nimi | |||
ja niihin viitataan | |||
$nimi | |||
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: | ||
#!/bin/bash | |||
#!/bin/bash | HEI="Hei, `whoami`, mitä kuuluu?" | ||
HEI="Hei, `whoami`, mitä kuuluu?" | echo $HEI | ||
echo $HEI | |||
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 73: | Rivi 45: | ||
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ä: | ||
numero=43 | |||
numero=43 | |||
== 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: | ||
if [ehto] | |||
if [ ehto ] | then | ||
then | |||
lauseita | lauseita | ||
elif [ toinen ehto ] | elif [toinen ehto] | ||
lauseita | lauseita | ||
else | else | ||
muita lauseita | muita lauseita | ||
fi | fi | ||
Ehdot merkitään hakasulkeiden sisään esimerkiksi seuraavalla tavalla | Ehdot merkitään hakasulkeiden sisään esimerkiksi seuraavalla tavalla | ||
#!/bin/bash | |||
#!/bin/bash | if [ $PWD = "/" ] | ||
if [ $PWD = "/" ] | then | ||
then | echo "Tämä skripti suoritetaan juurihakemistossa"; | ||
else | |||
else | echo "Skripti suoritetaan hakemistossa $PWD"; | ||
fi | |||
fi | |||
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 | ||
{|<!--taulukon määrite--> {{ | {|<!--taulukon määrite--> {{prettytable}} | ||
|- | |- | ||
! Operaattori | ! Operaattori | ||
Rivi 119: | Rivi 75: | ||
|- | |- | ||
<!-- taulukko alkaa tästä --> | <!-- taulukko alkaa tästä --> | ||
| -n || Pituus ei ole 0 | | -n || Pituus ei ole 0 | ||
|- | |- | ||
Rivi 127: | Rivi 81: | ||
| -d || Hakemisto on olemassa | | -d || Hakemisto on olemassa | ||
|- | |- | ||
| -f || | | -f || Tiedosto on olemassa | ||
|- | |- | ||
| -eq || Kokonaisluvut ovat yhtäsuuret | |||
| -eq || Kokonaisluvut ovat yhtäsuuret | |||
|- | |- | ||
| - | | -neq || Kokonaisluvut eivät ole yhtä suuret | ||
|- | |- | ||
| = || Merkkijonot ovat samat | | = || Merkkijonot ovat samat | ||
|- | |- | ||
| != || Merkkijonot eivät ole samat | | != || Merkkijonot eivät ole samat | ||
Rivi 145: | Rivi 93: | ||
| -lt || Kokonaisluku on pienempi kuin toinen | | -lt || Kokonaisluku on pienempi kuin toinen | ||
|- | |- | ||
| -gt || Kokonaisluku on suurempi kuin toinen | | -gt || Kokonaisluku on suurempi kuin toinen | ||
|- | |- | ||
| -le || Kokonaisluku on pienempi tai yhtäsuuri kuin toinen | | -le || Kokonaisluku on pienempi tai yhtäsuuri kuin toinen | ||
|- | |- | ||
| -ge || Kokonaisluku on suurempi tai yhtäsuuri kuin toinen | | -ge || Kokonaisluku on suurempi tai yhtäsuuri kuin toinen | ||
|} | |} | ||
Esimerkiksi seuraavat ehdot ovat tosia | Esimerkiksi seuraavat ehdot ovat tosia | ||
[ 2 -lt 5 ] | |||
[ 2 -lt 5 ] | [ "moi" != "linux" ] | ||
[ "moi" != "linux" ] | [ 54 -ge 53 ] | ||
[ 54 -ge 53 ] | [ -f "/etc/fstab" ] | ||
[ -f "/etc/fstab" ] | |||
== Silmukat == | == Silmukat == | ||
Rivi 164: | Rivi 110: | ||
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. | ||
for muuttuja in `ls` | |||
for muuttuja in `ls` | do | ||
do | echo $muuttuja | ||
done | |||
done | 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 | ||
echo "Lasketaan kymmeneen:" | |||
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 | for luku in $(seq 10) | ||
do | |||
echo "Lasketaan kymmeneen:" | echo $luku | ||
for luku in $(seq 10) | done | ||
do | |||
done | |||
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 | ||
for muuttuja in {c..o}; { echo -n "$muuttuja "; sleep 1;} | |||
=== While === | === While === | ||
== Vinkkejä == | == Vinkkejä == | ||
=== Joukot === | === 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 | 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 Mikolle työ- ja kotihakemistot, voisimme kirjoittaa lyhyesti näin | ||
mkdir {ma{ti,rta},jorma}n_{työ,koti}hakemisto | 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. | 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. | 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ä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. | 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. | ||
== Katso myös == | == Katso myös == | ||
*[[Komentorivin perusteet]] | *[[Komentorivin perusteet]] | ||
*[[Komentorivivinkkejä]] | *[[Komentorivivinkkejä]] | ||
== Linkkejä == | |||
*[http://tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide] - laaja englanninkielinen opas bash-skriptaukseen | |||
*[http://pegasus.rutgers.edu/~elflord/unix/bash-tute.html Pikaopas bash-skriptaukseen] (englanniksi) | |||
[[Luokka:Komentorivi]] | [[Luokka:Komentorivi]] | ||
[[Luokka:Ohjeet]] | [[Luokka:Ohjeet]] |