Forståelse og skrivefunktioner i Shell Scripts - del VI


Funktioner spiller en vigtig rolle i ethvert programmeringssprog. Som mange rigtige programmeringssprog har bash funktioner, der bruges med begrænset implementering.

Hvad er funktioner?

I programmering navngives funktioner sektioner af et program, der udfører en bestemt opgave. I denne forstand er en funktion en type procedure eller rutine. Når en funktion kaldes, forlader programmet det aktuelle afsnit af kode og begynder at udføre den første linje inde i funktionen. Når der er gentagen kode, eller når en opgave gentages, skal du overveje at bruge en funktion i stedet.

Overvej for eksempel det tilfælde, hvor vi har brug for at finde et nummer på flere trin i et bestemt program. I stedet for at skrive hele koden (til beregning af faktoriet) hver eneste gang, kan vi skrive den del af koden, der beregner faktoriet en gang inde i en blok og genbruge det ved flere lejligheder.

  1. Det hjælper os med at genbruge koden.
  2. Forbedre læsbarheden af programmet.
  3. Effektiv brug af variabler inde i programmet.
  4. Tillader os at teste programmet del for del.
  5. Viser programmet som en masse undertrin.

Den generelle syntaks til skrivefunktioner i shell-script inkluderer følgende måder.

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 er altid fri til at skrive gyldige kommandoer inde i disse funktionsblokke, som vi normalt gør i shell-scripts. Lad os nu prøve at skrive et enkelt script med en lille funktion inde i det.

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

Funktionsdefinitionen skal gå forud for det første opkald til den. Der er intet som at 'erklære funktionen', før du kalder det. Og vi kan altid rede funktioner inde i funktioner.

Bemærk: - Skrivning af tomme funktioner resulterer altid i syntaksfejl.

Når den samme funktion er defineret flere gange, er den endelige version det, der påberåbes. Lad os tage et eksempel.

#!/bin/bash

func_same ( ) {
	echo ‘First definition’
}

func_same ( ) {
	echo ‘Second definition’
}

func_same

exit 0

Lad os blive dybere ved at overveje funktioner, der tager parametre og returnerer værdier. For at returnere en værdi fra en funktion bruger vi den 'returnerede' shell-indbyggede. Syntaks er som følger.

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

På samme måde kan vi sende argumenter til funktionerne adskilt med mellemrum som angivet nedenfor.

func_name $arg_1 $arg_2 $arg_3

Inde i funktionen kan vi få adgang til argumenterne i rækkefølge som $ 1, $ 2, $ 3 og så videre. Se på følgende eksemplescript for at finde det maksimale af to heltal, der bruger funktionen for at tilføje mere klarhed.

#!/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 lidt kompleks ud, men det er simpelt, hvis vi læser gennem linjerne. Først indlejret if-else hvis linjer til valideringsformål, dvs. for at kontrollere antal og type argumenter ved hjælp af regulære udtryk. Derefter kalder vi funktionen med to kommandolinjeargumenter og viser resultatet der selv. Dette skyldes, at vi ikke kan returnere store heltal fra en funktion. En anden måde at omgå dette problem er at bruge globale variabler til at gemme resultatet i funktionen. Nedenstående script forklarer denne metode.

#!/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 nu nogle spændende problemer, der blev forklaret i den forrige shell-script-serie ved hjælp af funktioner som følger.

  1. Forstå grundlæggende Linux Shell Scripting Language Tips - del I
  2. 5 shell-scripts til Linux-nybegyndere til at lære shell-programmering - del II
  3. Sejler gennem verden af Linux BASH Scripting - del III
  4. Matematisk aspekt af Linux Shell-programmering - del IV
  5. Beregning af matematiske udtryk i Shell Scripting Language - del V

Jeg kommer tilbage med mere indsigt i funktionelle funktioner som brug af lokale variabler, rekursion osv. I den næste del. Bliv opdateret med kommentarer.