Ik zie dit in een shell-script.
variable=${@:2}
Wat doet het?
Reacties
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$@:2dubbelzinnig 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
var="my_value"; echo var="${var[@]:2}"; echo "$var"Zie het verschil?