Forstå og skrive funksjoner i Shell Scripts - Del VI


Funksjoner spiller en viktig rolle i ethvert programmeringsspråk. Som mange ekte programmeringsspråk har bash funksjoner som brukes med begrenset implementering.

Hva er funksjoner?

I programmering kalles funksjoner deler av et program som utfører en spesifikk oppgave. I denne forstand er en funksjon en type prosedyre eller rutine. Når en funksjon kalles, forlater programmet gjeldende kodeseksjon og begynner å utføre den første linjen inne i funksjonen. Når det er repeterende kode eller når en oppgave gjentas, bør du vurdere å bruke en funksjon i stedet.

Tenk for eksempel på tilfellet der vi må finne faktoren til et tall på flere stadier av et bestemt program. I stedet for å skrive hele koden (for å beregne faktoren) hver gang, kan vi skrive den delen av koden som beregner faktoren en gang inne i en blokk og gjenbruke den ved flere anledninger.

Hvorfor skriver vi funksjoner?

  1. Det hjelper oss å gjenbruke koden.
  2. Forbedre lesbarheten til programmet.
  3. Effektiv bruk av variabler inne i programmet.
  4. Lar oss teste programmet del for del.
  5. Viser programmet som en haug med undertrinn.
Funksjoner i shell-skript

Den generelle syntaksen for å skrive funksjoner i shell-skript inkluderer følgende måter.

function func_name {
	. . .
	commands
	. . .
}

or

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

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

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

Du står alltid fritt til å skrive gyldige kommandoer i disse funksjonsblokkene som vi vanligvis gjør i shell-skript. La oss nå prøve å skrive ett enkelt skript med en liten funksjon inne.

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

Funksjonsdefinisjonen må gå foran det første kallet til den. Det er ingenting som å "erklære funksjonen" før du kaller den. Og vi kan alltid hekke funksjoner inne i funksjoner.

Merk:- Å skrive tomme funksjoner resulterer alltid i syntaksfeil.

Når samme funksjon er definert flere ganger, er den endelige versjonen det som påkalles. La oss ta et eksempel.

#!/bin/bash

func_same ( ) {
	echo ‘First definition’
}

func_same ( ) {
	echo ‘Second definition’
}

func_same

exit 0
Funksjoner som tar parametere og returnerer verdier

La oss komme dypere ved å vurdere funksjoner som tar parametere og returnerer verdier. For å returnere en verdi fra en funksjon bruker vi det innebygde «retur»-skallet. Syntaksen er som følger.

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

På samme måte kan vi sende argumenter til funksjonene adskilt med mellomrom som gitt nedenfor.

func_name $arg_1 $arg_2 $arg_3

Inne i funksjonen kan vi få tilgang til argumentene i rekkefølge som $1, $2, $3 og så videre. Se på følgende eksempelskript for å finne maksimalt to heltall ved å bruke funksjon for å legge til mer klarhet.

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

Ovenstående ser ut som litt komplisert, men det er enkelt hvis vi leser gjennom linjene. Nestet først if-else if-linjer for valideringsformål, dvs. for å sjekke antall og type argumenter ved hjelp av regulære uttrykk. Etter det kaller vi funksjonen med to kommandolinjeargumenter og viser selve resultatet der. Dette er fordi vi ikke kan returnere store heltall fra en funksjon. En annen måte å omgå dette problemet på er å bruke globale variabler for å lagre resultatet i funksjonen. Skriptet nedenfor forklarer denne metoden.

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

Prøv nå ut noen spennende problemer som ble forklart i den forrige shell scripting-serien ved å bruke funksjonene som følger.

  1. Forstå grunnleggende Linux Shell-skriptspråktips – del I
  2. 5 Shell-skript for Linux-nybegynnere for å lære Shell-programmering – Del II
  3. Seile gjennom Linux-verdenen BASH-skripting – del III
  4. Matematisk aspekt ved Linux Shell-programmering – Del IV
  5. Beregning av matematiske uttrykk i Shell Scripting Language – Del V

Jeg vil komme tilbake med mer innsikt i funksjonelle funksjoner som bruk av lokale variabler, rekursjon osv. i neste del. Hold deg oppdatert med kommentarer.