Vad betyder detta $ {@: 2} i skalskript

Jag ser detta i ett skalskript.

variable=${@:2} 

Vad gör det?

Kommentarer

  • Är det exakt så det visades i manuset? Syntaxen ser ut som en matris men saknar några bitar. Kan du snälla lägga upp ett par rader runt denna rad från skriptet?
  • Det är en variabel som börjar från andra bokstaven. var="my_value"; echo var="${var[@]:2}"; echo "$var" Ser du skillnaden?

Svar

Det ”s visar innehållet i den speciella variabeln $@, i Bash. Den innehåller alla kommandoradsargumenten, och detta kommando tar alla argument från den andra och lagrar dem i en variabel , variable.

Exempel

Här är ett exempelskript.

#!/bin/bash echo ${@:2} variable=${@:3} echo $variable 

Exempelkörning:

./ex.bash 1 2 3 4 5 2 3 4 5 3 4 5 

Referenser

Kommentarer

  • Observera att den visade tekniken blandar de givna argumenten i en enda sträng. Om du behöver behålla dem som separata argument, använd en matris: vars=( "${@:2}" )
  • @glennjackman – tack för att du påpekade det.
  • Också notera användningen av de lockiga fästena. Du ska alltid använda lockiga parenteser, men Bash låter dig utelämna dem när sammanhanget är entydigt. Därför är $@ och ${@} identiska, även om den senare är " mer korrekt " syntax. Du måste använda parenteserna med ${@:2}, eftersom $@:2 är tvetydig och skulle därför tolkas som ${@}:2, vilket inte är samma sak.

Svar

Att ”sa ksh -funktion finns också i bash och senare versioner av zsh.

I ksh och bash kan du komma åt flera element i en matris med hjälp av ${array[@]:first:length} syntax, som expanderar till upp till length (eller allt om length utelämnas) element i array (i listan över element i matrisen sorterade numeriskt efter indexen), med början på den första med index större eller lika med first. När det är i skalärt sammanhang (som här i en tilldelning till en skalarvariabel) elementlistan förenas med mellanslag ch tecken med bash och ksh93 och med första tecknet i $IFS (eller ingenting om $IFS är tomt eller mellanslag om det inte är inställt) med zsh.

Till exempel:

$ a[23]=a a[5]=b a[235]=c a[45]=d $ x=${a[@]:12:2}; printf "<%s>\n" "$x" <a d> 

$@ är ett specialfall. $@ är matrisen med positionsparametrar ($1, $2 …). Men när det används med : ingår också $0. Så ${@:1} är samma som $@, inte ${@:0} som för andra matriser.

I zsh är det lite annorlunda. zsh lade till ksh syntax bara nyligen för kompatibilitet men har sin egen syntax för att välja element av element.

I motsats till ksh och bash, zsh matriser är en annan variabel typ än skalära variabler, är inte glesa (zsh har associerande matriser som en annan variabel typ) och start vid index 1 istället för 0.

För zsh får du tillgång till arrayelementintervaller med $a[first,last] (där last kan också vara negativt för att räkna bakåt från slutet).

I zsh,

a[23]=a a[5]=b a[235]=c a[45]=d 

skapar en matris med 235 element, de flesta är tomma. $a[12,50] skulle expandera till element 12 till 50 och ${a[@]:12:2} skulle bara expandera till (tomt) $a[12] och $a[13] -element. Som ett specialfall, och igen för portabilitet med ksh93 och bash, accepterar zsh ett 0 första element för $@ och behandlar det som $0.

Så, du kan använda ${a[@]:x:n} och ${@:x:n} portabelt över alla 3 skalen, men bara för icke-glesa matriser, och var uppmärksam på värdet på IFS.

Kommentarer

  • Tack för att du förklarar syntax för matrisindex

Lämna ett svar

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