Co oznacza ten $ {@: 2} w skryptach powłoki

27

Widzę to w skrypcie powłoki.

variable=${@:2}

Co to robi?

Lenin Raj Rajasekaran
źródło
Czy to dokładnie tak pokazano w skrypcie? Składnia wygląda jak tablica, ale brakuje niektórych elementów. Czy możesz napisać kilka wierszy wokół tego wiersza ze skryptu?
slm
Jest to zmienna zaczynająca się od drugiej litery. var="my_value"; echo var="${var[@]:2}"; echo "$var"Zobacz różnicę?
Valentin Bajrami

Odpowiedzi:

34

Pokazuje zawartość specjalnej zmiennej $@w Bash. Zawiera on wszystkie argumenty wiersza poleceń, a ta komenda bierze wszystkie argumenty z jednej na drugą i przechowując je w zmiennej variable.

Przykład

Oto skrypt przykładowy.

#!/bin/bash

echo ${@:2}

variable=${@:3}
echo $variable

Przykładowy przebieg:

./ex.bash 1 2 3 4 5
2 3 4 5
3 4 5

Referencje

slm
źródło
9
Zauważ, że pokazana technika łączy podane argumenty w pojedynczy ciąg. Jeśli chcesz zachować je jako osobne argumenty, użyj tablicy:vars=( "${@:2}" )
glenn jackman
@glennjackman - dziękuję za zwrócenie na to uwagi.
slm
2
Zwróć także uwagę na użycie nawiasów klamrowych. Powinieneś zawsze używać nawiasów klamrowych, ale Bash pozwala ci je pominąć, gdy kontekst jest jednoznaczny. W związku z tym, $@i ${@}są identyczne, chociaż ten ostatni jest „bardziej poprawna” składni. Musisz używać nawiasów ${@:2}, ponieważ $@:2jest niejednoznaczny i dlatego byłby interpretowany jako ${@}:2, co nie jest tym samym.
Paddy Landau
14

Jest to kshfunkcja dostępna również w bashnajnowszych wersjach zsh.

W kshi bashmożna uzyskać dostęp do kilku elementów tablicy za pomocą ${array[@]:first:length}składni, która rozwija się do length(lub wszystkich, jeśli lengthpominięto) elementów arraytablicy (na liście elementów tablicy posortowanych numerycznie według indeksów), zaczynając od pierwszy z indeksem większym lub równym first. W kontekście skalarnym (jak tutaj w przypisaniu do zmiennej skalarnej) lista elementów jest łączona znakami spacji zi bashoraz ksh93pierwszym znakiem $IFS(lub nic, jeśli $IFSjest pusta lub spacją, jeśli nie jest ustawiona) z zsh.

Na przykład:

$ a[23]=a a[5]=b a[235]=c a[45]=d
$ x=${a[@]:12:2}; printf '<%s>\n' "$x"
<a d>

$@to szczególny przypadek. $@to tablica parametrów pozycyjnych ( $1, $2...). Ale gdy jest używany z :, $0jest również uwzględniony. Więc ${@:1}jest taka sama jak $@, nie ${@:0}tak jak na innych tablicach.

W zshnieco inaczej. zshdodano kshniedawno składnię dla kompatybilności, ale ma własną składnię do wybierania zakresów elementów.

W przeciwieństwie do kshi bash, zshtablice są innego typu zmiennego niż zmienne skalarne, nie są rzadkie ( zshma tablice asocjacyjne jako inny typ zmiennej) i zaczynają się od indeksu 1 zamiast 0.

Do zsh, wchodzisz w zakresy elementów tablicy za pomocą $a[first,last](gdzie lastmoże być również ujemne, aby liczyć wstecz od końca).

w zsh,

a[23]=a a[5]=b a[235]=c a[45]=d

tworzy tablicę z 235 elementami, większość z nich pusta. $a[12,50]rozwinąłby się do elementów od 12 do 50 i ${a[@]:12:2}rozwinąłby się tylko do (pustych) $a[12]i $a[13]elementów. W szczególnym przypadku, i ponownie do przenoszenia z ksh93a bash, zshprzyjmuje się również 0pierwszy element $@i traktuje że jako $0.

Możesz więc używać ${a[@]:x:n}i ${@:x:n}przenosić we wszystkich 3 powłokach, ale tylko w przypadku macierzy nielicznych, i zwracaj uwagę na wartość IFS.

Stéphane Chazelas
źródło