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

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.