Jeg ser dette i et shell-script.
variable=${@:2}
Hvad laver det?
Kommentarer
Svar
Det “s viser indholdet af den specielle variabel $@
i Bash. Den indeholder alle kommandolinjeargumenterne, og denne kommando tager alle argumenter fra den anden og lagrer dem i en variabel , variable
.
Eksempel
Her er et eksempel på et script.
#!/bin/bash echo ${@:2} variable=${@:3} echo $variable
Eksempelkørsel:
./ex.bash 1 2 3 4 5 2 3 4 5 3 4 5
Referencer
Kommentarer
- Bemærk, at den viste teknik blander de givne argumenter i en enkelt snor. Hvis du har brug for at beholde dem som separate argumenter, skal du bruge et array:
vars=( "${@:2}" )
- @glennjackman – tak for at påpege det.
- Også bemærk brugen af de krøllede parenteser. Du skal altid bruge krøllede parenteser, men Bash giver dig mulighed for at udelade dem, når konteksten er entydig. Derfor er
$@
og${@}
identiske, skønt sidstnævnte er " mere korrekt " syntaks. Du skal bruge parenteserne med${@:2}
, fordi$@:2
er tvetydig og vil derfor blive fortolket som${@}:2
, hvilket ikke er den samme ting.
Svar
At “sa ksh
-funktion findes også i bash
og nyere versioner af zsh
.
I ksh
og bash
, kan du få adgang til flere elementer i et array ved hjælp af ${array[@]:first:length}
syntaksen, som udvides til op til length
(eller alle hvis length
udelades) elementer i array
array (i listen over elementerne i arrayet sorteret numerisk efter indekserne) startende med den første med indeks større eller lig med first
. Når det er i skalær sammenhæng (som her i en tildeling til en skalarvariabel) listen over elementer er forbundet med mellemrum ch tegn med bash
og ksh93
og med det første tegn i $IFS
(eller intet hvis $IFS
er tomt eller mellemrum, hvis det ikke er indstillet) 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 specielt tilfælde. $@
er en række positionsparametre ($1
, $2
…). Men når det bruges med :
, er $0
også inkluderet. Så ${@:1}
er det samme som $@
, ikke ${@:0}
som for andre arrays.
I zsh
er det lidt anderledes. zsh
tilføjede ksh
syntaks kun for nylig for kompatibilitet, men har sin egen syntaks til valg af elementområder.
I modsætning til ksh
og bash
, zsh
arrays er en anden variabeltype fra skalarvariabler, er ikke sparsomme (zsh
har associerende arrays som en anden variabeltype) og start ved indeks 1 i stedet for 0.
For zsh
får du adgang til array-elementintervaller med $a[first,last]
(hvor last
kan også være negativt at tælle baglæns fra slutningen).
I zsh
,
a[23]=a a[5]=b a[235]=c a[45]=d
opretter en matrix med 235 elementer, hvoraf de fleste er tomme. $a[12,50]
ville udvides til elementerne 12 til 50, og ${a[@]:12:2}
ville kun udvides til (tom) $a[12]
og $a[13]
-elementer. Som et specielt tilfælde og igen til bærbarhed med ksh93
og bash
, accepterer zsh
også et 0
første element til $@
og behandler det som $0
.
Så du kan bruge ${a[@]:x:n}
og ${@:x:n}
på alle 3 skaller, men kun til ikke-sparsomme arrays, og vær opmærksom på værdien af IFS.
Kommentarer
- Tak fordi du forklarede syntaks for matrixindeksering
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Ser du forskellen?