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?

  1. Se auttaa meitä käyttämään koodia uudelleen.
  2. Paranna ohjelman luettavuutta.
  3. Tehokas muuttujien käyttö ohjelman sisällä.
  4. Mahdollistaa ohjelman testaamisen osa kerrallaan.
  5. 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.

  1. Linux Shellin komentosarjakielen perusvihjeet – osa I
  2. 5 Shell-komentosarjaa Linux-aloittelijoille Shell-ohjelmoinnin oppimiseen – Osa II
  3. Purjehtiminen Linuxin BASH-komentosarjan maailman läpi – Osa III
  4. Linux Shell -ohjelmoinnin matemaattinen näkökohta – Osa IV
  5. 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.