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
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
"$@"
. Duargv
oppgaven vil brytes hvis noen argumenter inneholdt mellomrom.