Bash: udsnit af positionsparametre

Hvordan kan jeg få et udsnit af $@ i Bash uden først at skulle kopiere alle positionsparametre til et andet array som dette?

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

Kommentarer

  • Citér altid "$@". Din argv -opgave ville brydes, hvis argumenter indeholdt mellemrum.

Svar

Du kan bruge det samme format som for ethvert andet array. For at udtrække det 2. og 3. element fra $@ skal du gøre:

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

Kommentarer

  • Men dette ser ud til at fungere på en char for char basis i v4.1.2, er der en måde at gøre det på ord for ord basis?
  • @AlexejMagura I forstår ikke ' hvad du mener. Det virker på elementerne i arrayet. Hvis du har elementer med et tegn, fungerer det " på tegn ". Hvis hvert element er et ord, fungerer det på ord. Prøver du måske dette på en streng og ikke en matrix?
  • Jeg ' m prøver det på en kopi af " $ @ ", som jeg antager måske bliver en streng på det tidspunkt, jeg ' er ikke sikker.
  • På bash 4.2.46 giver "${@:1:2}" mig faktisk 1. og 2. kommandolinjeargumenter . I mellemtiden giver "${@:1}" mig de fulde kommandolinjeargumenter , og "${@:0}" giver mig scriptnavnet efterfulgt af fulde kommandolinjeargumenter .
  • @Rockallite godt, ja. Det 2. og 3. element i $@ -arrayet er det 1. og 2. argument. "${@:1}" vil udskrive hele arrayet startende med det 2. element (det første argument) og ${@:0} hele arrayet startende fra det første element, som er navnet på scriptet. Hvad forventede du?

Svar

For funktionsparametre er svaret med echo "${@:1:2}" fungerede overhovedet ikke for mig. Jeg ville også have udskæring af det første element, da det var en anden parameter. Hvad fungerede 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[@]}" } 

Måske skriver jeg for at teste for at se, hvordan dette fungerer med positionelle argumenter for på script-niveau, men ikke tid lige nu.

Svar

Jeg gør normalt dette:

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

som udskrives:

message = first other = second third goforth 

Du kan udvide konceptet ved at shift ing efter argumentet andet, tredje osv.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *