Hvordan sende argumenter til et Bash-skript

Skriv et Bash-skript slik at det mottar argumenter som spesifiseres når skriptet kalles opp fra kommandolinjen. Bruk denne metoden når et skript må utføre en litt annen funksjon avhengig av verdiene til inngangsparameterne, også kalt argumenter.

Dataskjerm med bash scripting illustrert

Lifewire / Ran Zheng

Eksempel på beståtte argumenter i et Bash-skript

Hvis du utviklet et skript kalt stats.sh som teller ordene i en fil, er det best å sende filnavnet som et argument slik at det samme skriptet kan brukes for alle filene som skal behandles. For eksempel hvis navnet på filen som skal behandles er sangliste, skriv inn følgende på kommandolinjen:

sh stats.sh sangliste

Argumenter er tilgjengelig i et skript ved å bruke variablene $1, $2, $3, og så videre. Variabelen $1 refererer til det første argumentet, $2 til det andre argumentet, og $3 til det tredje argumentet. For eksempel i skriptet:

FIL1=$1
wc $FILE1

Tilordne en variabel med et beskrivende navn til verdien av det første argumentet ($1), og ring deretter ordtellingsverktøyet (toalett) på variabelen $FILE1 eller hva annet du måtte ønske å gjøre.

Hvis du trenger et variabelt antall argumenter, bruk $@ variabel, som er en rekke av alle inngangsparametrene. Denne prosedyren bruker en for løkke å iterativt behandle hver enkelt, som illustrert i følgende eksempel:

for FIL1 i "$@"
gjøre
wc $FILE1
ferdig

Her er et eksempel på hvordan du kaller dette skriptet med argumenter fra kommandolinjen:

sh stats.sh sangliste1 sangliste2 sangliste3

Hvis et argument inkluderer mellomrom, omslutt det med enkle anførselstegn. For eksempel:

sh stats.sh 'songlist 1' 'songlist 2' 'songlist 3'

Flagg metode

Ofte skrives et skript slik at argumenter kan sendes i hvilken som helst rekkefølge ved hjelp av flagg. Med flaggmetoden kan noen av argumentene gjøres valgfrie.

Skriv for eksempel et script som henter informasjon fra en database basert på spesifiserte parametere, som f.eks brukernavn, Dato, og produkt, og genererer en rapport i et spesifisert format. Skriptet må skrives på en slik måte at disse parameterne sendes når skriptet kalles. Det kan se slik ut:

makereport -u jsmith -p notatbøker -d 10-20-2011 -f pdf

Bash aktiverer denne funksjonaliteten med getopts funksjon. For eksempelet ovenfor, bruk getopts følgende:

mens getopts u: d: p: f: alternativet
gjøre
sak "${option}"
i
u) BRUKER=${OPTARG};;
d) DATO=${OPTARG};;
p) PRODUKT=${OPTARG};;
f) FORMAT=${OPTARG};;
esac
ferdig

Dette er en while-løkke som bruker getopts funksjon og en såkalt optstring-i dette tilfellet u: d:p: f:– å iterere gjennom argumentene. De samtidig som loop går gjennom opt-strengen, som inneholder flaggene som brukes til å sende argumenter, og tildeler argumentverdien gitt for det flagget til variabelen alternativ. De sak setningen tildeler deretter verdien av variabelen alternativ til en global variabel som brukes etter at alle argumentene er lest.

Betydninger for kolon

Kolonene i opt-strengen betyr at det kreves verdier for de tilsvarende flaggene. I eksemplet ovenfor på u: d:p: f:, er alle flagg etterfulgt av et kolon. Dette betyr at alle flagg trenger en verdi. Hvis for eksempel d og f flagg ble ikke forventet å ha en verdi, u: dp: f ville være optstringen.

Startkolonet setter getopts i "stille rapporteringsmodus". I stedet for fullstendig feil i skriptet, fyller ethvert uventet argument? alternativet, og du kan se etter eller håndtere det etter behov. Uten det innledende kolon i opt-strengen, viser terminalen en feil. For eksempel har jeg manuset ovenfra som teller ord. Den forventer en syntaks som "stats.sh -f filnavn". Uten kolon, hvis jeg prøver "stats.sh -h", får jeg:

stats.sh -h
stats.sh: ulovlig alternativ -- h

Mens jeg med kolon kan sette en linje i skriptet mitt og forvente noe sånt som dette, for eksempel - ?) echo "No -${OPTARG} argument found.";;. Dette lar meg deretter fange opp og håndtere den uventede oppføringen (i dette tilfellet ved å sende ut min egen feilmelding).

stats.sh -h
Ingen -h-argument funnet.

Argumenter som ikke er innledet med et flagg, ignoreres av getopts. Hvis flagg spesifisert i opt-strengen ikke er gitt når skriptet kalles, skjer ingenting, med mindre du spesielt håndterer denne saken i koden din. Eventuelle argumenter ikke håndtert av getops kan fortsatt fanges med den vanlige $1, $2, og $3 variabler.