Skip to main content

Sådan passerer du argumenter til et Bash-Script

Calling All Cars: Highlights of 1934 / San Quentin Prison Break / Dr. Nitro (Kan 2025)

Calling All Cars: Highlights of 1934 / San Quentin Prison Break / Dr. Nitro (Kan 2025)
Anonim

Du kan skrive et bash script, så det modtager argumenter angivet, når scriptet kaldes fra kommandolinjen. Denne metode bruges, når et script skal udføre en lidt anderledes funktion afhængigt af værdierne for inputparametre (argumenterne).

For eksempel kan du have et script kaldet "stats.sh", der udfører en bestemt operation på en fil, f.eks. Tæller dets ord. Hvis du vil kunne bruge det script på mange filer, er det bedst at sende filnavnet som et argument, så du kan bruge det samme script til alle de filer, der skal behandles. Hvis f.eks. Navnet på den fil, der skal behandles, er "sangliste", vil du indtaste følgende kommandolinje:

sh stats.sh sangliste

Argumenter fås i et script ved hjælp af variablerne $ 1, $ 2, $ 3 osv., Hvor $ 1 refererer til det første argument, $ 2 til det andet argument osv. Dette illustreres i følgende eksempel:

FIL1 = $ 1wc $ FILE1

Til læsbarhed, tildele en variabel med et beskrivende navn til værdien af ​​det første argument ($ 1), og kald derefter ordtællingsværktøjet (wc) på denne variabel ($ FILE1).

Hvis du har et variabelt antal argumenter, kan du bruge variablen "$ @", som er en række af alle inputparametrene. Det betyder, at du kan bruge en for-loop til iterativt at behandle hver enkelt, som illustreret i følgende eksempel:

for FILE1 i "$ @"gørewc $ FILE1Færdig

Her er et eksempel på, hvordan man kalder dette script med argumenter fra kommandolinjen:

sh stats.sh sangliste1 sangliste2 sangliste3

Hvis et argument har mellemrum, skal du vedhæfte det med enkelte citater. For eksempel:

sh stats.sh 'sangliste 1' 'sangliste 2' 'sangliste 3'

Ofte skrives et script, så brugeren kan videresende i argumenter i enhver rækkefølge ved hjælp af flag. Med flagmetoden kan du også gøre nogle af de argumenter valgfrie.

Lad os sige, at du har et script, der henter information fra en database baseret på bestemte parametre, f.eks. "Brugernavn", "dato" og "produkt" og genererer en rapport i et bestemt "format". Nu vil du skrive dit script, så du kan passere i disse parametre, når scriptet kaldes. Det kan se sådan ud:

makereport -y jsmith -p notebooks -d 10-20-2011 -f pdf

Bash muliggør denne funktionalitet med "getopts" -funktionen. I ovenstående eksempel kan du bruge getopts som følger:

mens getopts u: d: p: f: optiongøretilfælde "$ {option}"iu) USER = $ {OPTARG} ;;d) DATO = $ {OPTARG} ;;p) PRODUKT = $ {OPTARG} ;;f) FORMAT = $ OPTARG ;;ESACFærdig

Dette er en tidssløjfe, der bruger funktionen "getopts" og en såkaldt "optstring", i dette tilfælde "u: d: p: f:" for at gentage gennem argumenterne. Tids-loop går gennem optstringen, som indeholder de flag, der kan bruges til at bestå argumenter, og tildeler argumentværdien for det pågældende flag til variablen "option". Case-statementen tildeler derefter værdien af ​​variablen "option" til en global variabel, der kan bruges, efter at alle argumenterne er blevet læst.

Kolonerne i optstringen betyder, at der kræves værdier for de tilsvarende flag. I ovenstående eksempel efterfølges alle flag med et kolon: "u: d: p: f:". Det betyder, at alle flag har brug for en værdi. Hvis f.eks. "D" og "f" -flagterne ikke forventedes at have en værdi, ville optstringen være "u: dp: f".

Et kolon i begyndelsen af ​​optstringen, for eksempel ": u: d: p: f:", har en helt anden betydning. Det giver dig mulighed for at håndtere flag, der ikke er repræsenteret i optstringen. I så fald er værdien af ​​"option" -variablen sat til "?" og værdien af ​​"OPTARG" er sat til det uventede flag. Den giver dig mulighed for at vise en passende fejlmeddelelse, der informerer brugeren om fejlen.

Argumenter, der ikke går forud for et flag, ignoreres af getopts. Hvis flag, der er angivet i optestringen, ikke leveres, når scriptet kaldes, sker der intet, medmindre du specielt håndterer denne sag i din kode. Eventuelle argumenter, der ikke håndteres af getops, kan stadig fanges med de regelmæssige $ 1, $ 2 osv. Variabler.