- Funksjoner lar deg innkapsle kodeblokker for å unngå redundans og forbedre lesbarheten til skript.
- Det er viktig å administrere omfanget av variabler ved hjelp av nøkkelordet lokalt for å unngå konflikter med det globale miljøet.
- Returverdier i Bash er begrenset til exit-tilstanden (0-255), noe som krever bruk av echo eller variabler for å returnere komplekse data.
- Modularisering ved bruk av source-kommandoen forenkler gjenbruk av funksjoner på tvers av flere systemfiler.
Når du begynner å skrive Bash-skript, er det normalt at alt virker enkelt i starten, men det kommer et punkt hvor koden blir et skikkelig rot. Hvis du har lagt merke til at du kopierer og limer inn de samme kommandobitene om og om igjen, er det på tide å ta steget over til funksjoner. I bunn og grunn er en funksjon som et lite skript i et annet skript som lar deg gi et navn til et sett med instruksjoner, slik at du kan kalle dem når du vil.
Det handler ikke bare om å spare tid på skriving, men om å ta i bruk en profesjonell praksis. Ved å unngå repetisjon av kode reduserer du drastisk sjansen for å gjøre feil, og fremfor alt gjør du vedlikeholdet mye enklere. Hvis du trenger å endre en forretningsregel eller fikse en feil, trenger du bare å gjøre det på ett sted i stedet for å søke gjennom hele filen etter hvor ellers du har gjentatt den.
Hvordan deklarere funksjoner i Bash
For å utføre en funksjon tilbyr Bash flere måter å gjøre det på, slik at du kan bruke det du foretrekker. Den vanligste og mest foretrukne måten er å skrive funksjonsnavnet etterfulgt av parenteser. For eksempel: mi_funcion() { comandos; }Det finnes også en mer eksplisitt syntaks som bruker det reserverte ordet funksjon før navnet, selv om det er mindre vanlig å finne det i moderne skrifttyper.
Hvis du har det travelt og vil definere alt på én linje, kan du gjøre det, men vær obs på mellomrom! Det er viktig å legge igjen et mellomrom. mellomrom etter åpningsnøkkelen og før den avsluttende setningen, i tillegg til å skille interne kommandoer med semikolon. For eksempel: nombre() { echo "Hola"; echo "Mundo"; }Hvis du glemmer disse detaljene, vil Bash klage, og skriptet vil ikke starte.
Et viktig poeng du ikke kan overse er at det å deklarere en funksjon ikke betyr at den vil kjøres automatisk. For at koden i krøllparentesene skal bli levende, må du kalle funksjonen ved navn i skriptets brødtekst. Husk også alltid å definere funksjonen før du prøver å bruke den . Hvis du kaller den før du deklarerer den, vil ikke skallet vite hva du snakker om og vil gi en feilmelding.
Variablenes spill: Globalt og lokalt omfang
Det er her mange blir forvirret. Som standard er enhver variabel du oppretter i Bash global . Dette betyr at hvis du definerer en variabel inne i en funksjon, vil den fortsette å eksistere og beholde verdien sin utenfor den funksjonen, noe som potensielt kan påvirke andre deler av programmet. Dette kan være nyttig, men i store skript er det ofte en oppskrift på katastrofe.
For å unngå disse overraskelsene finnes nøkkelordet `local` . Ved å deklarere en variabel som `local` inne i en funksjon, sikrer du at den bare er synlig og kan endres innenfor den kodeblokken. Hvis du har en global variabel og en lokal variabel med samme navn, vil den lokale variabelen prioriteres inne i funksjonen, men når funksjonen avsluttes, vil den globale variabelen gå tilbake til sin opprinnelige, uendrede verdi.
Overføring av argumenter til funksjoner
Funksjoner trenger ikke å være statiske; de kan motta data for å behandle forskjellig informasjon hver gang de kalles. For å sende argumenter, skriv dem ganske enkelt etter funksjonsnavnet, atskilt med mellomrom. Inne i funksjonen får du tilgang til dem ved hjelp av posisjonsvariabler som $1, $2Osv
Det er viktig å skille mellom at disse variablene er uavhengige av argumentene som mottas av hovedskriptet. Mens $0 refererer alltid til skriptnavn, variablene fra $1 opp $9 Innenfor en funksjon refererer disse spesifikt til parameterne som sendes til den funksjonen. I tillegg har vi nyttige verktøy som $# for å finne ut hvor mange argumenter som er mottatt, eller $@ for å se den fullstendige listen over parametere.
Dilemmaet med å returnere verdier
I motsetning til språk som Python eller Java, returnerer ikke Bash-funksjoner verdier i tradisjonell forstand. Hva setningen returnerer return er utgangsstatus, et heltall mellom 0 og 255. I følge konvensjonen indikerer 0 at alt har gått knirkefritt (vellykket), og ethvert annet tall representerer en feilkode.
Hvis du trenger å hente resultatet av en beregning eller tekst, har du to hovedalternativer. Det første er å bruke en global variabel til å lagre resultatet, selv om dette ikke er den reneste tilnærmingen. Det mer elegante alternativet er å bruke standardutgangen ved hjelp av kommandoen echo o printf og fange opp resultatet utenfra ved hjelp av kommandosubstitusjon: resultado=$(mi_funcion)På denne måten lagres verdien som skrives ut av funksjonen direkte i variabelen.
Avansert gjenbruk og rekursjon
En av Bashs perler er muligheten til å organisere funksjoner i separate filer. Hvis du har et sett med verktøy som du bruker i mange skript, kan du lagre dem i en fil (for eksempel utils.shog last dem inn i et hvilket som helst annet skript ved hjelp av kommandoen kilde (eller poenget) .Dette konverterer funksjonene dine til kommandoer som er tilgjengelige i gjeldende prosess, og optimaliserer utviklingstiden.
For de mer eventyrlystne finnes det rekursive funksjoner , som kaller seg selv. De er ideelle for å løse problemer som kan deles inn i identiske deloppgaver, for eksempel å beregne en faktorial. Nøkkelen her er å alltid definere et basistilfelle ; ellers vil funksjonen kalle seg selv uendelig til systemet går tom for ressurser og skriptet krasjer.
Å mestre bruken av funksjoner lar deg transformere lineære og kjedelige skript til modulære verktøy som er enkle å lese og vedlikeholde. Fra korrekt deklarasjon og intelligent administrasjon av variabelt omfang, til bruk av rekursjon og import av eksterne biblioteker via kildekode, gjør disse funksjonene Bash-skallet til et ekstremt kraftig automatiseringsmiljø for enhver systemadministrator eller utvikler.