Hvad betyder denne $ {@: 2} i shell-scripting

Jeg ser dette i et shell-script.

variable=${@:2} 

Hvad laver det?

Kommentarer

  • Er det nøjagtigt, hvordan det blev vist i scriptet? Syntaksen ligner en matrix, men mangler nogle stykker. Kan du venligst poste et par linjer omkring denne linje fra scriptet?
  • Det er en variabel, der starter med det andet bogstav. var="my_value"; echo var="${var[@]:2}"; echo "$var" Ser du forskellen?

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *