Was bedeutet das $ {@: 2} in Shell-Skripten?

27

Ich sehe das in einem Shell-Skript.

variable=${@:2}

Was macht es?

Lenin Raj Rajasekaran
quelle
Ist das genau so, wie es im Drehbuch gezeigt wurde? Die Syntax sieht aus wie ein Array, es fehlen jedoch einige Teile. Können Sie bitte ein paar Zeilen aus dem Skript um diese Zeile posten?
slm
Das ist eine Variable ab dem zweiten Buchstaben. var="my_value"; echo var="${var[@]:2}"; echo "$var"Sieh den Unterschied?
Valentin Bajrami

Antworten:

34

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.

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

Verweise

slm
quelle
9
Beachten Sie, dass die gezeigte Technik die angegebenen Argumente zu einer einzigen Zeichenfolge zusammenfasst. Wenn Sie sie als separate Argumente aufbewahren müssen, verwenden Sie ein Array:vars=( "${@:2}" )
Glenn Jackman
@glennjackman - danke für den Hinweis.
slm
2
Beachten Sie auch 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 $@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.
Paddy Landau
14

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.

Stéphane Chazelas
quelle