Bash: del av positionsparametrar

Hur kan jag få en del av $@ i Bash utan att först behöva kopiera alla positionsparametrar till en annan matris som denna?

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

Kommentarer

  • Citera alltid "$@". Din argv -uppgift skulle brytas om några args innehöll mellanslag.

Svar

Du kan använda samma format som för alla andra matriser. För att extrahera det andra och tredje elementet från $@ skulle du göra:

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

Kommentarer

  • Men detta verkar fungera på char-char-basis i v4.1.2, finns det ett sätt att göra det ord för ord?
  • @AlexejMagura I förstår inte ' vad du menar. Det verkar på elementen i matrisen. Om du har ett teckenelement fungerar det " på tecken ". Om varje element är ett ord fungerar det på ord. Försöker du kanske detta på en sträng och inte en matris?
  • Jag ' jag försöker på en kopia av " $ @ ", vilket jag antar kan bli en sträng vid den tiden, jag ' är inte säker.
  • På bash 4.2.46, "${@:1:2}" ger mig faktiskt kommandoradsargumenten första och andra >. Under tiden ger "${@:1}" mig fullständiga kommandoradsargument och "${@:0}" ger mig skriptnamnet följt av fullständiga kommandoradsargument .
  • @Rockallite bra, ja. Det andra och tredje elementet i $@ matrisen är det första och andra argumentet. "${@:1}" kommer att skriva ut hela arrayen med början med det andra elementet (det första argumentet) och ${@:0} hela arrayen med början från det första elementet som är namnet på manuset. Vad förväntade du dig?

Svar

För funktionsparametrar, svaret med echo "${@:1:2}" fungerade inte alls för mig. Jag ville också att avskärningen skulle vara det första elementet, eftersom det var en annan parameter. Vad som fungerade 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[@]}" } 

Kanske skriver jag för att testa för att se hur detta fungerar med positionella argument för på skriptnivå, men ingen tid just nu.

Svar

Jag brukar göra det här:

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

som kommer att skrivas ut:

message = first other = second third goforth 

Du kan utöka konceptet genom att shift ing efter argumentet andra, tredje osv.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *