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?
- Det hjelper oss å gjenbruke koden.
- Forbedre lesbarheten til programmet.
- Effektiv bruk av variabler inne i programmet.
- Lar oss teste programmet del for del.
- 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.
- Forstå grunnleggende Linux Shell-skriptspråktips – del I
- 5 Shell-skript for Linux-nybegynnere for å lære Shell-programmering – Del II
- Seile gjennom Linux-verdenen BASH-skripting – del III
- Matematisk aspekt ved Linux Shell-programmering – Del IV
- 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.