Ich sehe das in einem Shell-Skript.
variable=${@:2}
Was macht es?
bash
shell-script
ksh
Lenin Raj Rajasekaran
quelle
quelle
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Sieh den Unterschied?Antworten:
Es zeigt den Inhalt der speziellen Variablen
$@
in Bash. Es enthält alle Befehlszeilenargumente, und dieser Befehl übernimmt alle Argumente ab dem zweiten und speichert sie in einer Variablenvariable
.Beispiel
Hier ist ein Exampe-Skript.
Beispiellauf:
Verweise
quelle
vars=( "${@:2}" )
$@
und${@}
sind identisch, obwohl letztere die "korrektere" Syntax ist. Sie müssen die Klammern mit verwenden${@:2}
, da dies$@:2
mehrdeutig ist und daher als interpretiert würde${@}:2
, was nicht dasselbe ist.Dies ist eine
ksh
Funktion, die auch in denbash
neuesten Versionen von enthalten istzsh
.In
ksh
undbash
können Sie auf mehrere Elemente eines Arrays zugreifen, indem Sie die${array[@]:first:length}
Syntax verwenden, die zu bis zulength
(oder allen, wenn sielength
weggelassen wird) Elementen desarray
Arrays erweitert wird (in der Liste der Elemente des Arrays, die nach Indizes numerisch sortiert sind), beginnend mit der erste mit einem Index größer oder gleichfirst
. Im skalaren Kontext (wie hier bei einer Zuweisung zu einer skalaren Variablen) wird die Liste der Elemente mit Leerzeichen mitbash
undksh93
und mit dem ersten Zeichen von$IFS
(oder nichts, wenn$IFS
leer oder Leerzeichen, wenn es nicht gesetzt ist) mit verbundenzsh
.Zum Beispiel:
$@
ist ein Sonderfall.$@
ist das Array von Positionsparametern ($1
,$2
...). Aber wenn es mit verwendet wird:
,$0
ist es auch enthalten. Ist${@:1}
also dasselbe wie$@
, nicht${@:0}
wie bei anderen Arrays.In
zsh
ist es etwas anders.zsh
hat dieksh
Syntax erst kürzlich aus Kompatibilitätsgründen hinzugefügt , verfügt jedoch über eine eigene Syntax zum Auswählen von Elementbereichen.Im Gegensatz zu
ksh
undbash
sindzsh
Arrays ein anderer Variablentyp als skalare Variablen, nicht spärlich (zsh
hat assoziative Arrays als anderen Variablentyp) und beginnen bei Index 1 anstelle von 0.Für
zsh
greifen Sie auf Array-Elementbereiche mit zu$a[first,last]
(wobeilast
auch negativ sein kann, um vom Ende rückwärts zu zählen).In
zsh
,Erstellt ein Array mit 235 Elementen, von denen die meisten leer sind.
$a[12,50]
würde auf die Elemente 12 bis 50${a[@]:12:2}
expandieren und würde nur auf die (leeren)$a[12]
und$a[13]
Elemente expandieren . Als Sonderfall und erneut für die Portabilität mitksh93
undbash
wirdzsh
auch ein0
erstes Element akzeptiert$@
und behandelt, das als$0
.Sie können also alle drei Shells verwenden
${a[@]:x:n}
und${@:x:n}
portieren, jedoch nur für nicht-sparsame Arrays, und auf den Wert von IFS achten.quelle