Ich sehe dies in einem Shell-Skript.
variable=${@:2}
Was macht es?
Kommentare
- Ist das genau so, wie es im Skript angezeigt wurde? Die Syntax sieht aus wie ein Array, es fehlen jedoch einige Teile. Können Sie bitte ein paar Zeilen um diese Zeile aus dem Skript posten?
- Das ist eine Variable, die mit dem zweiten Buchstaben beginnt.
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Sehen Sie den Unterschied?
Antwort
Es ist Anzeigen des Inhalts der speziellen Variablen $@
in Bash. Sie enthält alle Befehlszeilenargumente, und dieser Befehl übernimmt alle Argumente ab der zweiten und speichert sie in einer Variablen , variable
.
Beispiel
Hier ist ein Exampe-Skript.
#!/bin/bash echo ${@:2} variable=${@:3} echo $variable
Beispiellauf:
./ex.bash 1 2 3 4 5 2 3 4 5 3 4 5
Referenzen
Kommentare
- Beachten Sie, dass die gezeigte Technik die angegebenen Argumente zu einem einzigen zusammenfasst Zeichenfolge. Wenn Sie sie als separate Argumente behalten müssen, verwenden Sie ein Array:
vars=( "${@:2}" )
- @glennjackman – danke, dass Sie darauf hingewiesen haben.
- Auch Beachten Sie die Verwendung der geschweiften Klammern. Sie sollten immer geschweifte Klammern verwenden, aber mit Bash können Sie sie weglassen, wenn der Kontext eindeutig ist. Daher sind
$@
und${@}
identisch, obwohl letztere die " korrekter " -Syntax. Sie müssen die Klammern mit${@:2}
verwenden, da$@:2
mehrdeutig ist und daher als${@}:2
, was nicht dasselbe ist.
Antwort
Das „sa ksh
-Funktion auch in bash
und neueren Versionen von zsh
.
In ksh
und bash
können Sie mithilfe der Syntax ${array[@]:first:length}
auf mehrere Elemente eines Arrays zugreifen wird auf bis zu length
(oder alle, wenn length
weggelassen wird) Elemente der array
erweitert Array (in der Liste der Elemente des Arrays, die numerisch nach den Indizes sortiert sind), beginnend mit dem ersten mit einem Index größer oder gleich first
. Im skalaren Kontext (wie hier in einem Zuordnung zu einer skalaren Variablen) Die Liste der Elemente wird mit dem Leerzeichen ch verbunden aracters mit bash
und ksh93
und mit dem ersten Zeichen von $IFS
(oder nichts, wenn $IFS
ist leer oder Leerzeichen, wenn es nicht gesetzt ist) mit 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
…). Bei Verwendung mit :
ist $0
ebenfalls enthalten. ${@:1}
ist also dasselbe wie $@
, nicht ${@:0}
wie bei anderen Arrays.
In zsh
ist dies etwas anders. zsh
fügte die ksh
Syntax aus Kompatibilitätsgründen erst kürzlich, hat jedoch eine eigene Syntax zum Auswählen von Elementbereichen.
Im Gegensatz zu ksh
und bash
, zsh
Arrays sind ein anderer Variablentyp als skalare Variablen, nicht spärlich (zsh
hat assoziative Arrays als anderen Variablentyp) und starten bei Index 1 statt 0.
Für zsh
greifen Sie mit $a[first,last]
(wobei last
kann auch negativ sein, 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 auf die Elemente 12 bis 50 erweitert, und ${a[@]:12:2}
würde nur auf die (leeren) $a[12]
und Elemente. Als Sonderfall und erneut für die Portabilität mit ksh93
und bash
akzeptiert zsh
ebenfalls ein 0
erstes Element für $@
und behandelt dies als $0
.
Sie können also ${a[@]:x:n}
und ${@:x:n}
portabel über alle 3 Shells hinweg verwenden, jedoch nur für nicht spärliche Arrays, und darauf achten der Wert von IFS.
Kommentare
- Vielen Dank für die Erläuterung der Array-Indizierungssyntax