Jeg ser dette i et skallskript.
variable=${@:2}
Hva gjør det?
Kommentarer
Svar
It «s viser innholdet til den spesielle variabelen $@
, i Bash. Den inneholder alle kommandolinjeargumentene, og denne kommandoen tar alle argumentene fra den andre og lagrer dem i en variabel , variable
.
Eksempel
Her er et eksempel på skript.
#!/bin/bash echo ${@:2} variable=${@:3} echo $variable
Eksempelkjøring:
./ex.bash 1 2 3 4 5 2 3 4 5 3 4 5
Referanser
Kommentarer
- Legg merke til at teknikken som vises blander de gitte argumentene til en enkelt streng. Hvis du trenger å beholde dem som separate argumenter, kan du bruke en matrise:
vars=( "${@:2}" )
- @glennjackman – takk for at du påpekte det.
- Også legg merke til bruken av krøllete parenteser. Du skal alltid bruke krøllete parenteser, men Bash lar deg utelate dem når konteksten er entydig. Derfor er
$@
og${@}
identiske, selv om sistnevnte er " mer riktig " syntaks. Du må bruke parentesene med${@:2}
, fordi$@:2
er tvetydig og vil derfor tolkes som${@}:2
, som ikke er det samme.
Svar
At «sa ksh
-funksjonen finnes også i bash
og nyere versjoner av zsh
.
I ksh
og bash
, kan du få tilgang til flere elementer i en matrise ved å bruke ${array[@]:first:length}
syntaksen, som utvides til opptil length
(eller alt hvis length
utelates) elementer i array
matrise (i listen over elementene i matrisen sortert numerisk på indeksene), og begynner med den første med indeks større eller lik first
. Når du er i skalær sammenheng (som her i en tilordning til en skalarvariabel) listen over elementene er knyttet til mellomrom ch tegn med bash
og ksh93
og med første tegn i $IFS
(eller ingenting hvis $IFS
er tomt eller mellomrom hvis det ikke er satt av) med zsh
.
For eksempel:
$ a[23]=a a[5]=b a[235]=c a[45]=d $ x=${a[@]:12:2}; printf "<%s>\n" "$x" <a d>
$@
er et spesielt tilfelle. $@
er matrisen med posisjonsparametere ($1
, $2
…). Men når det brukes med :
, er $0
også inkludert. Så ${@:1}
er det samme som $@
, ikke ${@:0}
som for andre matriser.
I zsh
er det litt annerledes. zsh
la til ksh
syntaks bare nylig for kompatibilitet, men har sin egen syntaks for valg av elementer.
I motsetning til ksh
og bash
, zsh
matriser er en annen variabel type enn skalarvariabler, er ikke sparsomme (zsh
har assosiative matriser som en annen variabel type) og start ved indeks 1 i stedet for 0.
For zsh
får du tilgang til arrayelementområder med $a[first,last]
(der last
kan også være negativt å telle bakover fra slutten).
I zsh
,
a[23]=a a[5]=b a[235]=c a[45]=d
oppretter en matrise med 235 elementer, de fleste er tomme. $a[12,50]
utvides til elementene 12 til 50, og ${a[@]:12:2}
vil bare utvides til (tom) $a[12]
og $a[13]
elementer. Som et spesielt tilfelle, og igjen for bærbarhet med ksh93
og bash
, godtar zsh
et 0
første element for $@
og behandler det som $0
.
Så, du kan bruke ${a[@]:x:n}
og ${@:x:n}
bærbart på tvers av alle 3 skjellene, men bare for ikke-sparsomme matriser, og ta hensyn til verdien av IFS.
Kommentarer
- Takk for at du forklarer syntaksen for matriseindeksering
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Ser du forskjellen?