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 $@:2mehrdeutig ist und daher als interpretiert würde ${@}:2, was nicht dasselbe ist.
Dies ist eine kshFunktion, die auch in den bashneuesten Versionen von enthalten ist zsh.
In kshund bashkö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 lengthweggelassen wird) Elementen des arrayArrays 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 bashund ksh93und mit dem ersten Zeichen von $IFS(oder nichts, wenn $IFSleer 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 :, $0ist es auch enthalten. Ist ${@:1}also dasselbe wie $@, nicht ${@:0}wie bei anderen Arrays.
In zshist es etwas anders. zshhat die kshSyntax erst kürzlich aus Kompatibilitätsgründen hinzugefügt , verfügt jedoch über eine eigene Syntax zum Auswählen von Elementbereichen.
Im Gegensatz zu kshund bashsind zshArrays ein anderer Variablentyp als skalare Variablen, nicht spärlich ( zshhat assoziative Arrays als anderen Variablentyp) und beginnen bei Index 1 anstelle von 0.
Für zshgreifen Sie auf Array-Elementbereiche mit zu $a[first,last](wobei lastauch 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 ksh93und bashwird zshauch ein 0erstes 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.