Shell Scripts -toimintojen ymmärtäminen ja kirjoittaminen - Osa VI
Funktioilla on tärkeä rooli missä tahansa ohjelmointikielessä. Kuten monet todelliset ohjelmointikielet, bashilla on toimintoja, joita käytetään rajoitetulla toteutuksella.
Mitä ovat toiminnot?
Ohjelmoinnissa funktiot ovat nimettyjä ohjelman osia, jotka suorittavat tietyn tehtävän. Tässä mielessä toiminto on eräänlainen menettely tai rutiini. Kun funktiota kutsutaan, ohjelma jättää nykyisen koodin osan ja alkaa suorittaa funktion ensimmäistä riviä. Aina kun koodi on toistuva tai tehtävä toistuu, harkitse funktion käyttöä sen sijaan.
Harkitse esimerkiksi tapausta, jossa meidän on löydettävä luvun faktoraali tietyn ohjelman useissa vaiheissa. Sen sijaan, että kirjoittaisimme koko koodin (faktoriaalin laskemista varten) joka kerta, voimme kirjoittaa sen osan koodista, joka laskee faktoriaalin kerran lohkon sisällä ja käyttää samaa uudelleen useaan otteeseen.
Miksi kirjoitamme funktioita?
- Se auttaa meitä käyttämään koodia uudelleen.
- Paranna ohjelman luettavuutta.
- Tehokas muuttujien käyttö ohjelman sisällä.
- Mahdollistaa ohjelman testaamisen osa kerrallaan.
- Näyttää ohjelman joukona alavaiheita.
Toiminnot shell-skripteissä
Yleinen syntaksi funktioiden kirjoittamiseen shell-skriptissä sisältää seuraavat tavat.
function func_name {
. . .
commands
. . .
}
or
func_name ( ) {
. . .
commands
. . .
}
Opening curly braces can also be used in the second line as well.
func_name ( )
{
. . .
commands
. . .
}
Voit aina vapaasti kirjoittaa kelvollisia komentoja näiden toimintolohkojen sisään, kuten me yleensä teemme shell-skripteissä. Yritetään nyt kirjoittaa yksi yksinkertainen kirjoitus, jossa on pieni funktio.
#!/bin/bash
call_echo ( ) {
echo ‘This is inside function’
}
op=$1
if [ $# -ne 1 ]; then
echo "Usage: $0 <1/0>"
else
if [ $1 = 0 ] ; then
echo ‘This is outside function’
elif [ $1 = 1 ] ; then
call_echo
else
echo ‘Invalid argument’
fi
fi
exit 0
Funktiomäärityksen tulee edeltää sen ensimmäistä kutsua. Ei ole mitään muuta kuin "funktion ilmoittaminen" ennen sen kutsumista. Ja voimme aina upottaa toimintoja funktioiden sisään.
Huomaa: - Tyhjien funktioiden kirjoittaminen johtaa aina syntaksivirheisiin.
Kun sama funktio määritellään useita kertoja, kutsutaan lopullinen versio. Otetaan esimerkki.
#!/bin/bash
func_same ( ) {
echo ‘First definition’
}
func_same ( ) {
echo ‘Second definition’
}
func_same
exit 0
Funktiot, jotka ottavat parametreja ja palauttavat arvoja
Mennään syvemmälle tarkastelemalla funktioita, jotka ottavat parametreja ja palauttavat arvoja. Palauttaaksemme arvon funktiosta käytämme sisäänrakennettua "return"-kuorta. Syntaksi on seuraava.
func_name ( ) {
. . .
commands
. . .
return $ret_val
}
Samalla tavalla voimme välittää argumentteja välilyönneillä erotetuille funktioille alla esitetyllä tavalla.
func_name $arg_1 $arg_2 $arg_3
Toiminnon sisällä voimme käyttää argumentteja järjestyksessä $1, $2, $3 ja niin edelleen. Katso seuraavaa esimerkkikomentosarjaa löytääksesi enintään kaksi kokonaislukua käyttämällä funktiota selkeyden lisäämiseksi.
#!/bin/bash
USG_ERR=7
max_two ( ) {
if [ "$1" -eq "$2" ] ; then
echo 'Equal'
exit 0
elif [ "$1" -gt "$2" ] ; then
echo $1
else
echo $2
fi
}
err_str ( ) {
echo "Usage: $0 <number1> <number2>"
exit $USG_ERR
}
NUM_1=$1
NUM_2=$2
x
if [ $# -ne 2 ] ; then
err_str
elif [ `expr $NUM_1 : '[0-9]*'` -eq ${#NUM_1} ] ; then
if [ `expr $NUM_2 : '[0-9]*'` -eq ${#NUM_2} ] ; then
max_two $NUM_1 $NUM_2
else
err_str
fi
else
err_str
fi
exit 0
Yllä oleva näyttää hieman monimutkaiselta, mutta se on yksinkertaista, jos luemme rivit läpi. Ensin sisäkkäiset if-else if -rivit validointia varten eli argumenttien määrän ja tyypin tarkistamiseksi säännöllisten lausekkeiden avulla. Tämän jälkeen kutsumme funktiota kahdella komentoriviargumentilla ja näyttää tuloksen siellä itse. Tämä johtuu siitä, että emme voi palauttaa suuria kokonaislukuja funktiosta. Toinen tapa kiertää tämä ongelma on käyttää globaaleja muuttujia tulosten tallentamiseen funktion sisällä. Alla oleva skripti selittää tämän menetelmän.
#!/bin/bash
USG_ERR=7
ret_val=
max_two ( ) {
if [ "$1" -eq "$2" ] ; then
echo 'Equal'
exit 0
elif [ "$1" -gt "$2" ] ; then
ret_val=$1
else
ret_val=$2
fi
}
err_str ( ) {
echo "Usage: $0 <number1> <number2>"
exit $USG_ERR
}
NUM_1=$1
NUM_2=$2
if [ $# -ne 2 ] ; then
err_str
elif [ `expr $NUM_1 : '[0-9]*'` -eq ${#NUM_1} ] ; then
if [ `expr $NUM_2 : '[0-9]*'` -eq ${#NUM_2} ] ; then
max_two $NUM_1 $NUM_2
echo $ret_val
else
err_str
fi
else
err_str
fi
exit 0
Kokeile nyt joitain jännittäviä ongelmia, jotka selitettiin edellisessä komentotulkkikomentosarjassa käyttämällä seuraavia toimintoja.
- Linux Shellin komentosarjakielen perusvihjeet – osa I
- 5 Shell-komentosarjaa Linux-aloittelijoille Shell-ohjelmoinnin oppimiseen – Osa II
- Purjehtiminen Linuxin BASH-komentosarjan maailman läpi – Osa III
- Linux Shell -ohjelmoinnin matemaattinen näkökohta – Osa IV
- Matemaattisten lausekkeiden laskeminen Shell-komentosarjakielellä – Osa V
Palaan seuraavassa osassa saadakseni lisää tietoa toiminnallisista ominaisuuksista, kuten paikallisten muuttujien käytöstä, rekursiosta jne. Pysy ajan tasalla kommenteista.