Bash: del av posisjonsparametere

Hvordan kan jeg få et stykke $@ i Bash uten å måtte kopiere alle posisjonsparametere til en annen matrise som dette?

argv=( "$@" ) echo "${argv[@]:2}"; 

Kommentarer

  • Sitat alltid "$@". Du argv oppgaven vil brytes hvis noen argumenter inneholdt mellomrom.

Svar

Du kan bruke samme format som for alle andre matriser. For å trekke ut andre og tredje element fra $@, gjør du:

echo "${@:1:2}" - - | |----> slice length |------> slice starting index 

Kommentarer

  • Men dette ser ut til å fungere på røye for røye basis i v4.1.2, er det en måte å gjøre det på ord for ord?
  • @AlexejMagura I ikke ' t forstå hva du mener. Det virker på elementene i matrisen. Hvis du har elementer med ett tegn, fungerer det " på tegn ". Hvis hvert element er et ord, fungerer det på ord. Prøver du kanskje dette på en streng og ikke en matrise?
  • Jeg ' prøver det på en kopi av " $ @ ", som jeg antar kan bli en streng på det tidspunktet, jeg ' er ikke sikker.
  • Bash 4.2.46 gir "${@:1:2}" meg faktisk 1. og 2. kommandolinjeargumentene . I mellomtiden gir "${@:1}" meg hele kommandolinjeargumentene , og "${@:0}" gir meg skriptnavnet etterfulgt av fullstendige argumenter for kommandolinjen .
  • @Rockallite vel, ja. Det andre og tredje elementet i $@ matrisen er det første og det andre argumentet. "${@:1}" vil skrive ut hele matrisen som begynner med det andre elementet (det første argumentet) og ${@:0} hele matrisen fra det første elementet som er navnet på skriptet. Hva forventet du?

Svar

For funksjonsparametere, svaret med echo "${@:1:2}" fungerte ikke for meg i det hele tatt. Dessuten ønsket jeg at det første elementet ble avskåret, siden det var en annen parameter. Det som fungerte var:

function foo(){ #takes single param + array of params local param1="$1". #first param local -a tmp=( "${@}" ) #copy all params local -a rem_params=( "${tmp[@]:1}") #slice off first:Works! # local -a rem_params=( "${@[@]:1}" ) #DID NOT WORK, ERROR # local -a rem_params=( "{@:1}" ) #DID NOT SLICE echo "${rem_params[@]}" } 

Kanskje jeg skriver for å teste for å se hvordan dette fungerer med posisjonsargumenter for på skriptnivå, men ingen tid akkurat nå.

Svar

Jeg pleier å gjøre dette:

somefunc() { local message="$1" shift echo "message = $message" echo "other = $@" } somefunc first second third goforth 

som skal skrives ut:

message = first other = second third goforth 

Du kan utvide konseptet ved å shift ing etter andre, tredje osv. argument

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *