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.
- Det hjælper os med at genbruge koden.
- Forbedre læsbarheden af programmet.
- Effektiv brug af variabler inde i programmet.
- Tillader os at teste programmet del for del.
- 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.
- Forstå grundlæggende Linux Shell Scripting Language Tips - del I
- 5 shell-scripts til Linux-nybegyndere til at lære shell-programmering - del II
- Sejler gennem verden af Linux BASH Scripting - del III
- Matematisk aspekt af Linux Shell-programmering - del IV
- 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.