Hvordan sende og analysere Linux Bash-skriptargumenter og parametere

Hvordan sende og analysere Linux Bash-skriptargumenter og parametere

Parsing og overføring av argumenter til bash-skript/shell-skript er ganske lik måten vi sender argumenter til funksjonene inne i Bash-skript. Vi vil se den faktiske prosessen med å overføre argumentene til et skript og også se på måten å få tilgang til disse argumentene inne i skriptet.

Passere argumenter før du kjører

Vi kan sende parametere like etter navnet på skriptet mens vi kjører bash-tolkerkommandoen. Du kan sende parametere eller argumenter til filen. Bare kommandoen for å kjøre skriptet normalt ved å legge til verdien av parameterne direkte til skriptet. Hver parameter er en mellomromseparert verdi som skal overføres til shell-skriptet.

bash scriptname.sh 

Kommandoen ovenfor vil bare kjøre skriptet uten å sende parametrene.

Mens kommandoen nedenfor vil sende argumentene til skriptet.

bash scriptname.sh parameter1 parameter2 parameter3 nth-parameter 

Kjører bash-skript med bestått parametere

Skjermbildet ovenfor viser parameterne som er sendt til skriptet, hvordan vi gjør det, som vi vil forklare i neste avsnitt. Men akkurat nå kan vi se at vi har sendt inn parameterne fra utsiden av skriptet ved å bruke bash-miljøvariabler. Du kan til og med bruke strenger og andre datatyper, men pass deg for eventuelle mellomrom. White space vil gjøre variabelen til en egen parameter. Så, spesielt for strenger, vær forsiktig med å omgi dem med anførselstegn.

Oppdage kommandolinjeargumenter

Nå skal vi se hvordan vi får tilgang til disse parameterne inne i skriptet. Vi bruker antallet parametere som er sendt i rekkefølgen, dvs. for de første parameterne som ble sendt, vil vi analysere (få tilgang til) parameteren ved å bruke $1 som variabel. Den første parameteren er lagret i $1-variabelen. Videre kan du tilordne denne variabelen til enhver annen brukerdefinert variabel du liker. For den n-te parameteren som sendes, kan du bruke $n for å få tilgang til den aktuelle parameteren. Her starter variabelnavnet med 1 fordi filnavnet/skriptnavnet er den 0. parameteren. Hvis du har mer enn 9 parametere, sørg for å bruke { } rundt tallet som uten parentes, bash vil bare se $10 som $1 og ekskludere 0, så bruk ${10} og så videre i stedet for bare $10.

#!/bin/bash echo '1st parameter = $1 ' echo '2nd Parameter = $2 ' 

Skriptet ovenfor kan få tilgang til parameterne fra kommandolinjen/skallet ved å bruke posisjonsparametrene, som er 1, 2, 3 og så videre.

Få tilgang til argumentene fra skriptet.

Som du kan se, har vi brukt {} for å få tilgang til parametervariabelnumrene fra 10 og utover. Skriptet kan brukes for loops og while loops for å iterere over parameterne, men vi vil diskutere det i videre avsnitt.

Tilordne oppgitte argumenter til Bash Variable

Vi kan også tilordne det til andre tilpassede variabler for å gjøre skriptet mer dynamisk og forme det etter behovene. Selv om skriptet ovenfor når det kjøres bare vil skrive ut to parametere, kan du sikkert få tilgang til flere parametere ved å bruke variabelen som rekkefølgen av parametere i tall. Skriptet kan få tilgang til posisjonsvariablene fra kommandolinjen og bruke dem på de nødvendige stedene der det er nødvendig i skriptet.

#!/bin/bash a=$1 b=$2 p=$(($a*$b)) echo 'The product of $a and $b = $p' 

Tilordne oppgitte argumenter til Bash Variable

Skriptet ovenfor får tilgang til posisjonsparametrene, dvs. $1 og $2 som er sendt inn i skriptet og lagrer de brukerdefinerte variablene for å få tilgang til dem senere og endre dem deretter. Vi kan også få tilgang til flere parametere ved å bruke iterative metoder som vi vil se i de kommende delene.

Vi har også muligheten til å se etter NULL eller tomme parametere som sendes ved å bruke flaggene -z eller -n. Fra dette kan vi verifisere om parametrene ble bestått eller ikke.

#!/bin/bash if [[ -z $1 ]]; then echo 'No parameter passed.' else echo 'Parameter passed = $1' fi 

Se etter posisjonsparametere som er sendt inn eller ikke.

Med dette skriptet kan vi oppdage om noen posisjonelle parametere ble sendt inn eller ingenting ble sendt. -z-flagget sjekker for NULL eller uinitialiserte variabler i BASH. -z-flagget returnerer true hvis variabelen som sendes er NULL eller uinitialisert. Derfor kan vi bruke grunnleggende If-else-setninger for å oppdage parameterne som er bestått.

Vi kan også bruke -n flagg som returnerer sant hvis ingen parametere sendes, så vi må benytte oss av ! for å reversere tilstanden.

Slik som følger:

#!/bin/bash if [[ ! -n $1 ]]; then echo 'No parameter passed.' else echo 'Parameter passed = $1' fi 

Dette skriptet vil også gi samme utdata, men vi bruker -n flagg i stedet for -z.

Lese flere argumenter med For- eller While-løkke

Vi kan bruke @ variabel for å få tilgang til hver parameter som sendes til skriptet via kommandolinjen. Det er en spesiell variabel som inneholder utvalget av variabler i BASH. I dette tilfellet bruker vi det alene, så det inneholder utvalget av posisjonelle parametere som sendes inn. Vi kan bruke det til å iterere over parameterne som sendes ved hjelp av loops eller while loop også.

#!/bin/bash for i in $@ do echo -e '$i
' done 

Bruke loops og @ variabel for å få tilgang til parameterne som matriseelementer.

Vi brukte en rekkeviddebasert for-løkke for å iterere til det er elementer i @-matrisen. Vi itererer ganske enkelt over matrisen og skriver ut elementet. Vi kan ganske enkelt tildele den, endre verdiene og gjøre de nødvendige endringene i parameterne og argumentene for å oppnå ønsket resultat fra skriptet.

ELLER

Vi kan også skrive ut argumentene ved å bruke while-løkken og miljøvariablene til BASH.

#!/bin/bash i=$(($#-1)) while [ $i -ge 0 ]; do echo ${BASH_ARGV[$i]} i=$((i-1)) done 

Bruker while-løkke for å iterere over de beståtte parameterne.

Vi bruker variabelen ' # ' siden den inneholder antall parametere som sendes inn. Vi initialiserer antall parametere og tar bort en ettersom vi skal bruke en matrise til å iterere over den. Så, som vanlig, starter matrisens indeks fra 0. Ettersom denne matrisen initialiseres fra det siste elementet eller parameteren som ble passert, må vi redusere telleren til 0 for å skrive ut hver parameter i den rekkefølgen den sendes. Vi bruker ganske enkelt BASH_ARGV-matrisen for å få tilgang til parameterne og skrive ut verdien. Ved hver iterasjon reduserer vi også verdien av i- iteratoren eller telleren med én ved å bruke de aritmetiske doble klammeparentesene. Fra dette skriver vi ganske enkelt ut hver parameter som sendes til skriptet ved å bruke en while-løkke som vist fra utdataskjermbildet.

Lesing med parameternavn

Bruke getopts for å analysere argumenter og parametere

Vi kan bruke getopts-programmet/kommandoen til å analysere argumentene som sendes til skriptet i kommandolinjen/terminalen ved å bruke loops og switch-case-setninger.

#!/bin/bash while getopts n:c: option do case '${option}' in n)nation=${OPTARG};; c)code=${OPTARG};; esac done echo 'Nation : $nation' echo 'code : $code' 

Bruke getopts for å analysere argumenter og parametere

Ved å bruke getopts kan vi tilordne posisjonsargumentene/parametrene fra kommandolinjen til bash-variablene direkte. Dette gjør at vi kan administrere parametrene pent og på en systematisk måte. I skriptet ovenfor har vi brukt to argumenter for å lagre bash-variablene ved å bruke getopts-syntaksen, mens-løkker og bytte-case-setninger.

Skrive ut verdier av alle argumenter

Vi kan skrive ut argumentene som sendes til skriptet med en enkel kraftig variabel '@' som lagrer alle parameterne som er sendt.

#!/bin/bash echo 'The arguments passed in are : $@' 

Skrive ut verdier av alle argumenter

Få tilgang til antall beståtte parametere

Vi kan også bruke variabelen '#' for å få tilgang til antall parametere som sendes fra kommandolinjen. Variabelen # inneholder i utgangspunktet antall parametere/argumenter som sendes inn i skriptet.

#!/bin/bash echo 'The number of arguments passed in are : $#' 

Få tilgang til antall beståtte parametere

Følgende var prosessen og spesifikasjonen for å sende og analysere variablene i bash-skriptet. Logikken med å skifte og gjøre endringer i variablene ligger i brukerens hender. Dette var bare en demonstrasjon av å sende inn og analysere argumentene fra kommandolinjen til skriptet for å gjøre dem mer dynamiske.