Ich sehe das in einem Shell-Skript.
variable=${@:2}
Was macht es?
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Sieh den Unterschied?
Ich sehe das in einem Shell-Skript.
variable=${@:2}
Was macht es?
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 Variablen variable
.
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
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 den bash
neuesten Versionen von enthalten ist zsh
.
In ksh
und bash
können Sie auf mehrere Elemente eines Arrays zugreifen, indem Sie die ${array[@]:first:length}
Syntax verwenden, die zu bis zu length
(oder allen, wenn sie length
weggelassen wird) Elementen des array
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 gleich first
. Im skalaren Kontext (wie hier bei einer Zuweisung zu einer skalaren Variablen) wird die Liste der Elemente mit Leerzeichen mit bash
und ksh93
und mit dem ersten Zeichen von $IFS
(oder nichts, wenn $IFS
leer oder 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
...). 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 die ksh
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
und bash
sind zsh
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]
(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 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 mit ksh93
und bash
wird zsh
auch ein 0
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.