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

Siirry navigaatioon Siirry hakuun
119 merkkiä lisätty ,  9. elokuuta 2017
komento väärin
p (ShellCheck loistava tarkistus ohjelma)
(komento väärin)
(9 välissä olevaa versiota 2 käyttäjän tekeminä ei näytetä)
Rivi 13: Rivi 13:
Tehdään aluksi yksinkertainen skripti, joka esittelee muutamia perustoimintoja:
Tehdään aluksi yksinkertainen skripti, joka esittelee muutamia perustoimintoja:
<source lang="bash">
<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>
</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 30: Rivi 30:
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">
<source lang="bash">
echo "`ls`"
echo "`ls`"
</source>
</source>


Rivi 37: Rivi 37:
Skripti voitaisiin myös kirjoittaa suoraan komentoriville muodossa
Skripti voitaisiin myös kirjoittaa suoraan komentoriville muodossa
<source lang="bash">
<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>
</source>


Rivi 43: Rivi 43:
Muuttujat määritellään syntaksilla
Muuttujat määritellään syntaksilla
<source lang="bash">
<source lang="bash">
nimi=arvo
nimi=arvo
</source>
</source>
ja niihin viitataan laittamalla muuttujan eteen $
ja niihin viitataan laittamalla muuttujan eteen $
<source lang="bash">
<source lang="bash">
$nimi
$nimi
</source>
</source>
Siinä tapauksessa mikäli halutaan, että komennon tulos on muuttuja asetetaan muuttuja tyyliin:
Siinä tapauksessa mikäli halutaan, että komennon tulos on muuttuja asetetaan muuttuja tyyliin:
Rivi 55: Rivi 55:
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">
<source lang="bash">
${foo}bar
${foo}bar
</source>
</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.
Rivi 61: Rivi 61:
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">
<source lang="bash">
#!/bin/bash
#!/bin/bash
HEI="Hei, `whoami`, mitä kuuluu?"
HEI="Hei, `whoami`, mitä kuuluu?"
echo $HEI
echo $HEI
</source>
</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 74: Rivi 74:
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">
<source lang="bash">
numero=43
numero=43
</source>
</source>


Rivi 80: Rivi 80:
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">
<source lang="bash">
if [ ehto ]
if [ ehto ]
then
then
     lauseita
     lauseita
elif [ toinen ehto ]
elif [ toinen ehto ]
then
then
     lauseita
     lauseita
else
else
     muita lauseita
     muita lauseita
fi
fi
</source>
</source>


Ehdot merkitään hakasulkeiden sisään esimerkiksi seuraavalla tavalla
Ehdot merkitään hakasulkeiden sisään esimerkiksi seuraavalla tavalla
<source lang="bash">
<source lang="bash">
#!/bin/bash
#!/bin/bash
if [ $PWD = "/" ]
if [ $PWD = "/" ]
then
then
        echo "Tämä skripti suoritetaan juurihakemistossa";
    echo "Tämä skripti suoritetaan juurihakemistossa";
else
else
        echo "Skripti suoritetaan hakemistossa $PWD";
    echo "Skripti suoritetaan hakemistossa $PWD";
fi
fi
</source>
</source>


Rivi 144: Rivi 144:
Esimerkiksi seuraavat ehdot ovat tosia
Esimerkiksi seuraavat ehdot ovat tosia
<source lang="bash">
<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>
</source>


Rivi 155: Rivi 155:


<source lang="bash">
<source lang="bash">
for muuttuja in `ls`  
for muuttuja in `ls`  
do
do
  echo $muuttuja
    echo $muuttuja
done
done
</source>
</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 komennon [[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 komennon [[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">
<source lang="bash">
echo "Lasketaan kymmeneen:"
echo "Lasketaan kymmeneen:"
for luku in $(seq 10)
for luku in $(seq 10)
do
do
  echo $luku
    echo $luku
done
done
</source>
</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
for muuttuja in {c..o}; { echo -n "$muuttuja "; sleep 1;}
<source lang="bash">for muuttuja in {c..o}; { echo -n "$muuttuja "; sleep 1;}</source>


=== While ===
=== While ===
While suorittaa lausekkeita niin kauan kuin ehto on tosi. Kun ehto on epätosi poistutaan loopista jolloin skriptin suoritus jatkuu seuraavalta loogiselta riviltä (while-lausekkeen jälkeiseltä riviltä).
While suorittaa lausekkeita niin kauan kuin ehto on tosi. Kun ehto on epätosi poistutaan loopista jolloin skriptin suoritus jatkuu seuraavalta loogiselta riviltä (while-lausekkeen jälkeiseltä riviltä).
<source lang="bash">
<source lang="bash">
while [ ehto ]
while [ ehto ]
do
do
  lauseita
    lauseita
done
done


Esimerkki:
Esimerkki:
while [ -f "testi" ]
while [ -f "testi" ]
do
do
  echo "Tiedosto on olemassa."
    echo "Tiedosto on olemassa."
  sleep 1
    sleep 1
done
done
</source>
</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.
Rivi 192: Rivi 192:
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">
<source lang="bash">
until [ ehto ]
until [ ehto ]
do
do
  lauseita
    lauseita
done
done
</source>
</source>


Rivi 263: Rivi 263:


<source lang="bash">
<source lang="bash">
#!/bin/bash
#!/bin/bash
for  i in `seq -f"%03g" 1 104`
for  i in `seq -f"%03g" 1 104`
do
do
     wget -c "http://koskisuomi.pp.fi/linucast/LinuCast$i.ogg"
     wget -c "http://koskisuomi.pp.fi/linucast/LinuCast$i.ogg"
done
done
</source>
</source>


Rivi 324: Rivi 324:
*[http://www.panix.com/~elflord/unix/bash-tute.html Pikaopas bash-skriptaukseen] (englanniksi)
*[http://www.panix.com/~elflord/unix/bash-tute.html Pikaopas bash-skriptaukseen] (englanniksi)
*[http://gd.tuwien.ac.at/linuxcommand.org/writing_shell_scripts.php Writing shell scripts] - toinen laaja englanninkielinen opas bash-skriptaukseen
*[http://gd.tuwien.ac.at/linuxcommand.org/writing_shell_scripts.php Writing shell scripts] - toinen laaja englanninkielinen opas bash-skriptaukseen
*[http://www.shellcheck.net/ ShellCheck] on www-ohjelma, joka havaitsee kaikki sh ja bash-skriptien ja komentojen ongelmat.
*[http://www.shellcheck.net/ ShellCheck] on www-ohjelma, joka havaitsee kaikki [[sh]] ja [[bash]]-skriptien ongelmat ja antaa niille parannus ehdotukset.
*[http://explainshell.com/ ExplainShell] on www-ohjelma, joka antaa ohjetekstin annetuille komennoille.  
 




[[Luokka:Komentorivi]]
[[Luokka:Komentorivi]]
[[Luokka:Ohjeet]]
[[Luokka:Ohjeet]]
Rekisteröitymätön käyttäjä

Navigointivalikko