Wat betekent dit $ {@: 2} in shell-scripting

Ik zie dit in een shell-script.

variable=${@:2} 

Wat doet het?

Reacties

  • Is dat precies hoe het in het script werd getoond? De syntaxis ziet eruit als een array, maar er ontbreken enkele stukjes. Kun je alsjeblieft een paar regels rond deze regel plaatsen vanuit het script?
  • Dat is een variabele die begint vanaf de tweede letter. var="my_value"; echo var="${var[@]:2}"; echo "$var" Zie het verschil?

Antwoord

Het is toont de inhoud van de speciale variabele $@, in Bash. Het bevat alle opdrachtregelargumenten, en deze opdracht neemt alle argumenten van de tweede en slaat ze op in een variabele , variable.

Voorbeeld

Hier is een voorbeeldscript.

#!/bin/bash echo ${@:2} variable=${@:3} echo $variable 

Voorbeeld run:

./ex.bash 1 2 3 4 5 2 3 4 5 3 4 5 

Referenties

Reacties

  • Merk op dat de getoonde techniek de gegeven argumenten samenvoegt tot een enkele draad. Als je ze als aparte argumenten wilt behouden, gebruik dan een array: vars=( "${@:2}" )
  • @glennjackman – bedankt dat je erop wijst.
  • Ook let op het gebruik van accolades. Het is de bedoeling dat je altijd accolades gebruikt, maar met Bash kun je ze weglaten als de context ondubbelzinnig is. Daarom zijn $@ en ${@} identiek, hoewel de laatste " correcter is " syntaxis. U moet de haakjes gebruiken met ${@:2}, omdat $@:2 dubbelzinnig is en daarom wordt geïnterpreteerd als ${@}:2, wat niet hetzelfde is.

Antwoord

Dat “sa ksh functie ook gevonden in bash en recente versies van zsh.

In ksh en bash, hebt u toegang tot verschillende elementen van een array door de ${array[@]:first:length} syntaxis te gebruiken, die breidt uit tot maximaal length (of alle als length wordt weggelaten) elementen van de array array (in de lijst met elementen van de array numeriek gesorteerd op de indexen), beginnend met de eerste met een index groter dan of gelijk aan first. In scalaire context (zoals hier in een toewijzing aan een scalaire variabele) wordt de lijst met elementen samengevoegd met spatie ch tekens met bash en ksh93 en met het eerste teken van $IFS (of niets als $IFS is leeg of spatie als het niet is ingesteld) met zsh.

Bijvoorbeeld:

$ a[23]=a a[5]=b a[235]=c a[45]=d $ x=${a[@]:12:2}; printf "<%s>\n" "$x" <a d> 

$@ is een speciaal geval. $@ is de reeks positionele parameters ($1, $2 …). Maar wanneer gebruikt met :, is $0 ook inbegrepen. Dus ${@:1} is hetzelfde als $@, niet ${@:0} zoals voor andere arrays.

In zsh is het “iets anders. zsh heeft de ksh syntaxis pas onlangs voor compatibiliteit, maar heeft zijn eigen syntaxis voor het selecteren van reeksen elementen.

In tegenstelling tot ksh en bash, zsh arrays zijn een ander type variabele dan scalaire variabelen, zijn niet schaars (zsh heeft associatieve arrays als een ander type variabele) en starten op index 1 in plaats van 0.

Voor zsh krijg je toegang tot arrayelementbereiken met $a[first,last] (waarbij last kan ook negatief zijn om vanaf het einde terug te tellen).

In zsh,

a[23]=a a[5]=b a[235]=c a[45]=d 

maakt een array met 235 elementen, waarvan de meeste leeg zijn. $a[12,50] zou uitbreiden naar elementen 12 tot 50, en ${a[@]:12:2} zou alleen worden uitgebreid naar de (lege) $a[12] en $a[13] elementen. Als een speciaal geval, en nogmaals voor overdraagbaarheid met ksh93 en bash, accepteert zsh ook een 0 eerste element voor $@ en behandelt dat als $0.

U kunt dus ${a[@]:x:n} en ${@:x:n} overdraagbaar gebruiken voor alle 3 shells, maar alleen voor niet-sparse arrays, en let op de waarde van IFS.

Opmerkingen

  • Bedankt voor het uitleggen van de syntaxis van de arrayindexering

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *