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

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

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 kshFunktion ist auch in bashund neueren Versionen von zu finden zsh.

In kshund bashkönnen Sie auf mehrere Elemente eines Arrays zugreifen, indem Sie die ${array[@]:first:length}Syntax verwenden, die auf bis zu length(oder alle, wenn lengthweggelassen wird) Elemente des arrayArrays 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 bashund ksh93und mit dem ersten Zeichen von $IFS(oder nichts, wenn $IFSleer 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 :, $0ist auch enthalten. ${@:1}Ist also dasselbe wie $@, nicht ${@:0}wie bei anderen Arrays.

In zshist es etwas anders. zshDie kshSyntax 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 kshund 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.bashzshzsh

Für zshgreifen Sie mit auf Array-Elementbereiche 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 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 ksh93und akzeptiert auch ein basherstes Element für und behandelt das als .zsh0$@$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.

verwandte Informationen