Shell-komentosarjojen ymmärtäminen ja kirjoittaminen - osa VI


Toiminnoilla on tärkeä rooli kaikilla ohjelmointikielillä. Kuten monilla oikeilla ohjelmointikielillä, bashilla on toimintoja, joita käytetään rajoitetusti.

Mitä toiminnot ovat?

Ohjelmoinnissa toiminnot nimetään ohjelman osiksi, jotka suorittavat tietyn tehtävän. Tässä mielessä funktio on eräänlainen toimenpide tai rutiini. Kun toimintoa kutsutaan, ohjelma jättää nykyisen koodiosan ja alkaa suorittaa ensimmäisen rivin toiminnon sisällä. Aina kun toistuva koodi on tai kun tehtävä toistuu, harkitse sen sijaan toiminnon käyttöä.

Tarkastellaan esimerkiksi tapausta, jossa meidän on löydettävä luvun faktori tietyn ohjelman useissa vaiheissa. Sen sijaan, että kirjoittaisimme koko koodin (kertoimen laskemiseksi) joka kerta, voimme kirjoittaa sen koodin osan, joka laskee kertoimen kerran lohkon sisällä ja käyttää samaa uudelleen useita kertoja.

  1. Se auttaa meitä käyttämään koodia uudelleen.
  2. Paranna ohjelman luettavuutta.
  3. Muuttujien tehokas käyttö ohjelman sisällä.
  4. Antaa meille mahdollisuuden testata ohjelman osaa osittain.
  5. Näyttää ohjelman joukkoa alivaiheita.

Shint-komentosarjojen toimintojen kirjoittamisen yleinen syntakse sisältää seuraavat tapat.

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 kirjoittaa kelvollisia komentoja näiden toimintolohkojen sisään, kuten tavallisesti shell-skripteissä. Yritetään nyt kirjoittaa yksi yksinkertainen komentosarja, jossa on pieni toiminto.

#!/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

Funktion määrittelyn on edeltettävä ensimmäistä kutsua siihen. Ei ole mitään muuta kuin funktion ilmoittaminen ennen sen kutsumista. Ja voimme aina pestä toimintoja toimintojen sisällä.

Huomaa: - Tyhjien toimintojen kirjoittaminen johtaa aina syntaksivirheisiin.

Kun sama funktio määritetään useita kertoja, lopullinen versio on se, jota kutsutaan. Otetaan esimerkki.

#!/bin/bash

func_same ( ) {
	echo ‘First definition’
}

func_same ( ) {
	echo ‘Second definition’
}

func_same

exit 0

Mennään syvemmälle tarkastelemalla toimintoja, jotka ottavat parametrit ja palauttavat arvot. Palauttaaksesi arvon funktiosta käytämme sisäänrakennettua 'return' -kuorta. Syntaksi on seuraava.

func_name ( ) {
	. . .
	commands
	. . .
	return $ret_val
}

Vastaavasti voimme välittää argumentit funktioille, jotka on erotettu välilyönneillä, kuten alla on esitetty.

func_name $arg_1 $arg_2 $arg_3

Funktion sisällä voimme käyttää argumentteja järjestyksessä kuten $1, $2, $3 ja niin edelleen. Katso seuraava esimerkkikomento löytääksesi enintään kaksi kokonaislukua käyttämällä funktiota lisääksesi selkeyttä.

#!/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

Edellä oleva näyttää hieman monimutkaiselta, mutta se on yksinkertaista, jos luemme rivit läpi. Ensin sisäkkäin if-else if -rivit validointia varten, ts. Argumenttien lukumäärän ja tyypin tarkistamiseksi säännöllisten lausekkeiden avulla. Sen jälkeen kutsumme funktion kahdella komentoriviargumentilla ja näytämme tuloksen itse. Tämä johtuu siitä, ettemme voi palauttaa suuria kokonaislukuja funktiosta. Toinen tapa kiertää tämä ongelma on käyttää globaaleja muuttujia tuloksen tallentamiseksi toimintoon. Alla oleva komentosarja 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ä komentosarjasarjasarjassa käyttämällä seuraavia toimintoja.

  1. Ymmärrä Linuxin komentotulkikielikomennot - osa I
  2. 5 Shell-komentosarjaa Linux-aloittelijoille oppia Shell-ohjelmointia - osa II
  3. Purjehdus Linuxin BASH-komentosarjojen maailmassa - osa III
  4. Linux Shell -ohjelmoinnin matemaattinen näkökohta - osa IV
  5. Matemaattisten lausekkeiden laskeminen komentotulkkikielellä - osa V

Palaan enemmän tietoa toiminnallisista ominaisuuksista, kuten paikallisten muuttujien käytöstä, rekursiosta jne. Seuraavassa osassa. Pysy ajan tasalla kommenteilla.