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$@: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
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Zie het verschil?