Razumevanje in pisanje funkcij v skriptih lupine - VI. Del


Funkcije igrajo pomembno vlogo v katerem koli programskem jeziku. Kot mnogi pravi programski jeziki ima tudi bash funkcije, ki se uporabljajo z omejeno implementacijo.

Kaj so funkcije?

Pri programiranju so funkcije imenovane odseke programa, ki izvaja določeno nalogo. V tem smislu je funkcija vrsta postopka ali rutine. Ko funkcijo pokličete, program zapusti trenutni odsek kode in začne izvajati prvo vrstico znotraj funkcije. Kadar se ponavlja koda ali kadar se opravilo ponovi, razmislite o uporabi funkcije.

Na primer, razmislimo o primeru, ko moramo v več fazah določenega programa najti faktorje števila. Namesto da vsakič napišemo celotno kodo (za izračun faktorja), lahko napišemo tisti del kode, ki faktorja izračuna enkrat v bloku in jo večkrat ponovno uporabimo.

  1. Pomaga nam pri ponovni uporabi kode.
  2. Izboljšati berljivost programa.
  3. Učinkovita uporaba spremenljivk znotraj programa.
  4. Omogoča preizkušanje programskega dela po delih.
  5. Program prikaže kot kup pod korakov.

Splošna sintaksa za pisanje funkcij v skriptu lupine vključuje naslednje načine.

function func_name {
	. . .
	commands
	. . .
}

or

func_name ( ) {
	. . .
	commands
	. . .
}

Opening curly braces can also be used in the second line as well.

func_name ( )
{
	. . .
	commands
	. . .
}

V te funkcijske bloke lahko vedno vpišete veljavne ukaze, kot to običajno počnemo v skriptih lupine. Zdaj poskusimo napisati en preprost skript z majhno funkcijo v njem.

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

Opredelitev funkcije mora biti pred prvim klicem. Nič ni tako kot »razglasitev funkcije«, preden jo pokličete. In funkcije lahko vedno ugnezdimo znotraj funkcij.

Opomba: - Pisanje praznih funkcij vedno povzroči sintaksne napake.

Ko je ista funkcija definirana večkrat, se prikliče končna različica. Vzemimo primer.

#!/bin/bash

func_same ( ) {
	echo ‘First definition’
}

func_same ( ) {
	echo ‘Second definition’
}

func_same

exit 0

Poglobimo se, če upoštevamo funkcije, ki vzamejo parametre in vrnejo vrednosti. Za vrnitev vrednosti iz funkcije uporabimo vgrajeno lupino 'return'. Sintaksa je naslednja.

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

Podobno lahko argumente posredujemo funkcijam, ločenim s presledki, kot je navedeno spodaj.

func_name $arg_1 $arg_2 $arg_3

Znotraj funkcije lahko dostopamo do argumentov po vrsti 1 $, 2 $, 3 $in tako naprej. Oglejte si naslednji primer skripta, da poiščete največ dve celo število s pomočjo funkcije za večjo jasnost.

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

Zgoraj je videti nekoliko zapleteno, vendar je preprosto, če preberemo vrstice. Najprej ugnezdene if-else if vrstice za namene preverjanja veljavnosti, torej za preverjanje števila in vrste argumentov s pomočjo regularnih izrazov. Nato funkcijo pokličemo z dvema argumentoma ukazne vrstice in tam prikaže rezultat sam. To je zato, ker iz funkcije ne moremo vrniti velikih celih števil. Drug način za rešitev te težave je uporaba globalnih spremenljivk za shranjevanje rezultata znotraj funkcije. Spodnji skript pojasnjuje to metodo.

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

Zdaj preizkusite nekaj vznemirljivih težav, ki so bile razložene v prejšnji seriji skriptov lupine z uporabo naslednjih funkcij.

  1. Razumevanje osnovnih nasvetov za skriptni jezik lupine Linux - I. del
  2. 5 skriptov lupine za začetnike Linuxa, ki se učijo programiranja lupine - II. del
  3. Jadranje po svetu Linux BASH skript - III. del
  4. Matematični vidik programiranja lupine Linuxa - IV. del
  5. Izračun matematičnih izrazov v skriptnem jeziku Shell - V. del

V naslednjem delu se bom vrnil z več vpogleda v funkcionalne funkcije, kot so uporaba lokalnih spremenljivk, rekurzija itd. Bodite na tekočem s komentarji.