Bash: deel van positionele parameters

Hoe kan ik een deel $@ in Bash krijgen zonder eerst te hoeven kopiëren alle positionele parameters naar een andere array zoals deze?

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

Reacties

  • Citeer altijd "$@". Je argv toewijzing zou breken als args spaties bevatten.

Antwoord

U kunt hetzelfde formaat gebruiken als voor elke andere array. Om het 2e en 3e element uit $@ te halen, doet u het volgende:

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

Reacties

  • Maar dit lijkt te werken op char by char basis in v4.1.2, is er een manier om dit woord voor woord te doen?
  • @AlexejMagura I niet ' begrijpen wat je bedoelt. Dat werkt op de elementen van de array. Als u elementen van één teken heeft, werkt het " op tekens ". Als elk element een woord is, werkt het op woorden. Probeer je dit misschien op een string en niet op een array?
  • Ik ' m probeer het op een kopie van " $ @ ", waarvan ik vermoed dat het op dat moment een string kan worden, ik ' ben niet zeker.
  • Op bash 4.2.46, "${@:1:2}" geeft me eigenlijk de eerste en 2e opdrachtregelargumenten . Ondertussen geeft "${@:1}" me de volledige opdrachtregelargumenten , en "${@:0}" geeft me de scriptnaam gevolgd door volledige opdrachtregelargumenten .
  • @Rockallite nou ja. Het 2e en 3e element van de $@ -array zijn de 1e en 2e argumenten. "${@:1}" drukt de hele array af, beginnend met het 2e element (het 1e argument) en ${@:0} de hele array, beginnend bij het 1e element dat is de naam van het script. Wat had je verwacht?

Antwoord

Voor functieparameters, het antwoord met echo "${@:1:2}" werkte helemaal niet voor mij. Ik wilde ook het eerste element afsnijden, omdat het een andere parameter was. Wat wel werkte, was:

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[@]}" } 

Misschien zal ik schrijven om te testen hoe dit werkt met positionele argumenten voor op scriptniveau, maar nu heb ik geen tijd.

Antwoord

Meestal doe ik dit:

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

wat zal afdrukken:

message = first other = second third goforth 

Je kunt het concept uitbreiden door shift ing na het tweede, derde, etc. argument

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *