Jag ser detta i ett skalskript.
variable=${@:2}
Vad gör det?
Kommentarer
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
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Ser du skillnaden?