Ich sehe dies in einem Shell-Skript.
variable=${@:2}
Was macht es?
Antwort1
Es zeigt den Inhalt der speziellen Variable $@
in Bash. Sie enthält alle Befehlszeilenargumente, und dieser Befehl nimmt alle Argumente ab dem zweiten und speichert sie in einer Variablen variable
.
Beispiel
Hier ist ein Beispielskript.
#!/bin/bash
echo ${@:2}
variable=${@:3}
echo $variable
Beispiellauf:
./ex.bash 1 2 3 4 5
2 3 4 5
3 4 5
Verweise
Antwort2
Diese ksh
Funktion ist auch in bash
und neueren Versionen von zu finden zsh
.
In ksh
und bash
können Sie auf mehrere Elemente eines Arrays zugreifen, indem Sie die ${array[@]:first:length}
Syntax verwenden, die auf bis zu length
(oder alle, wenn length
weggelassen wird) Elemente des array
Arrays erweitert wird (in der Liste der Elemente des Arrays, numerisch sortiert nach den Indizes), beginnend mit dem ersten mit Index größer oder gleich first
. In einem Skalarkontext (wie hier bei einer Zuweisung an eine Skalarvariable) wird die Liste der Elemente mit Leerzeichen mit bash
und ksh93
und mit dem ersten Zeichen von $IFS
(oder nichts, wenn $IFS
leer ist, bzw. einem Leerzeichen, wenn es nicht gesetzt ist) mit verbunden zsh
.
Zum Beispiel:
$ a[23]=a a[5]=b a[235]=c a[45]=d
$ x=${a[@]:12:2}; printf '<%s>\n' "$x"
<a d>
$@
ist ein Sonderfall. $@
ist das Array von Positionsparametern ( $1
, $2
...). Wenn es jedoch mit verwendet wird :
, $0
ist auch enthalten. ${@:1}
Ist also dasselbe wie $@
, nicht ${@:0}
wie bei anderen Arrays.
In zsh
ist es etwas anders. zsh
Die ksh
Syntax wurde 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
und sind Arrays ein anderer Variablentyp als Skalarvariablen, sind nicht spärlich ( haben assoziative Arrays als anderen Variablentyp) und beginnen beim Index 1 statt bei 0.bash
zsh
zsh
Für zsh
greifen Sie mit auf Array-Elementbereiche zu $a[first,last]
(wobei last
auch negativ sein kann, um vom Ende rückwärts zu zählen).
In zsh
,
a[23]=a a[5]=b a[235]=c a[45]=d
erstellt ein Array mit 235 Elementen, von denen die meisten leer sind. $a[12,50]
würde sich auf die Elemente 12 bis 50 erweitern und ${a[@]:12:2}
würde sich nur auf die (leeren) $a[12]
und $a[13]
Elemente erweitern. Als Sonderfall und wiederum aus Gründen der Portabilität mit ksh93
und akzeptiert auch ein bash
erstes Element für und behandelt das als .zsh
0
$@
$0
${a[@]:x:n}
Sie können es also ${@:x:n}
portabel über alle drei Shells hinweg verwenden, aber nur für nicht-spärliche Arrays, und auf den Wert von IFS achten.