Hva betyr denne $ {@: 2} i skallskript

Jeg ser dette i et skallskript.

variable=${@:2} 

Hva gjør det?

Kommentarer

  • Er det akkurat slik det ble vist i skriptet? Syntaksen ser ut som en matrise, men mangler noen brikker. Kan du legge ut et par linjer rundt denne linjen fra skriptet?
  • Det er en variabel som starter fra andre bokstav. var="my_value"; echo var="${var[@]:2}"; echo "$var" Ser du forskjellen?

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *