Skip to content

Hur man skickar argument till ett Bash -skript

13 de september de 2021
How to Pass Arguments to a Bash Script 2200571 final2 be3eeccc278244bfbadce52ee4a4a14e

Skriv ett Bash -skript så att det tar emot argument som specificeras när manuset anropas från kommandoraden. Använd den här metoden när ett skript måste utföra en något annorlunda funktion beroende på värdena för inmatningsparametrarna, även kallade argument.

Exempel på att skicka argument i ett basskript

Om du utvecklat ett manus som heter stats.sh som räknar orden i en fil är det bäst att skicka filnamnet som ett argument så att samma skript kan användas för alla filer som ska bearbetas. Till exempel om namnet på filen som ska bearbetas är låtlista, ange följande på kommandoraden: sh stats.sh låtlista

Argument nås i ett skript med hjälp av variablerna $ 1, $ 2, $ 3, och så vidare. Variabeln $ 1 hänvisar till det första argumentet, $ 2 till det andra argumentet och $ 3 till det tredje argumentet. Till exempel i skriptet: FILE1 = $ 1
wc $ FILE1

Tilldela värdet för det första argumentet en variabel med ett beskrivande namn ($ 1) och ring sedan till ordräkningsverktyget (WC) på variabeln $ FILE1 eller vad du än vill göra. Om du behöver ett variabelt antal argument använder du [email protected] variabel, som är en array med alla ingångsparametrar. Denna procedur använder en for loop för att iterativt behandla var och en, som illustreras i följande exempel: för FILE1 i ”[email protected]
do
wc $ FILE1
Gjort

Här är ett exempel på hur man kallar detta skript med argument från kommandoraden: sh stats.sh songlist1 songlist2 songlist3

Om ett argument innehåller mellanslag, bifoga det med enstaka citattecken. Till exempel: sh stats.sh ’låtlista 1’ ’låtlista 2’ ’låtlista 3’

Flaggmetod

Ofta skrivs ett skript så att argument kan skickas i valfri ordning med flaggor. Med flaggmetoden kan några av argumenten göras valfria. Skriv till exempel ett skript som hämtar information från en databas baserat på angivna parametrar, t.ex. Användarnamn, datum, och produkt, och genererar en rapport i ett visst format. Manuset måste skrivas på ett sådant sätt så att dessa parametrar passeras när manuset anropas. Det kan se ut så här: makereport -u jsmith -p anteckningsböcker -d 10-20-2011 -f pdf

class = ”ql-syntax”> Bash möjliggör denna funktionalitet med getopts fungera. Använd exemplet ovan getopts enligt följande: medan getopts u: d: p: f: alternativ
do
fallet ”$ {option}”
i
u) ANVÄNDARE = ​​$ {OPTARG} ;;
d) DATE = $ {OPTARG} ;;
p) PRODUKT = $ {OPTARG} ;;
f) FORMAT = $ {OPTARG} ;;
esac
Gjort

class = ”ql-syntax”> Detta är en stundslinga som använder getopts funktion och en så kallad optstring-I detta fall u: d: p: f:– att iterera genom argumenten. De medan loop går genom optstring, som innehåller flaggorna som används för att skicka argument, och tilldelar variabeln argumentvärdet som tillhandahålls för den flaggan till variabeln alternativ. De fall statement tilldelar sedan variabelns värde alternativ till en global variabel som används efter att alla argument har lästs.

Betydelser för kolon

Kolonerna i optsträngen betyder att värden krävs för motsvarande flaggor. I ovanstående exempel på u: d: p: f:, följs alla flaggor av ett kolon. Det betyder att alla flaggor behöver ett värde. Om till exempel d och f flaggor förväntades inte ha ett värde, u: dp: f skulle vara optsträngen. Startkolon sätter getopter i ”tyst rapporteringsläge”. Istället för att helt felställa manuset fyller alla oväntade argument? alternativet och du kan leta efter eller hantera det efter behov. Utan den första kolon i optsträngen visar terminalen ett fel. Till exempel har jag manuset ovanifrån som räknar ord. Det väntar en syntax som ”stats.sh -f filnamn”. Utan kolon, om jag försöker ”stats.sh -h”, får jag: stats.sh -h
stats.sh: olagligt alternativ – h

Med kolon kan jag sedan sätta en rad i mitt manus som förväntar mig något liknande detta, till exempel -?) Echo ”No – $ {OPTARG} argument hittat.” ;; . Detta gör att jag sedan kan fånga och hantera den oväntade posten (i det här fallet genom att skriva ut mitt eget felmeddelande). stats.sh -h
Inget -h -argument hittades.

Argument som inte föregås av en flagga ignoreras av getopts. Om flaggor som anges i optsträngen inte tillhandahålls när manuset kallas händer ingenting, såvida du inte hanterar detta fall speciellt i din kod. Alla argument som inte hanteras av getops kan fortfarande fångas med den vanliga $ 1, $ 2, och $ 3 variabler.