Widzę to w skrypcie powłoki.
variable=${@:2}
Co to robi?
bash
shell-script
ksh
Lenin Raj Rajasekaran
źródło
źródło
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Zobacz różnicę?Odpowiedzi:
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 zmiennejvariable
.Przykład
Oto skrypt przykładowy.
Przykładowy przebieg:
Referencje
źródło
vars=( "${@:2}" )
$@
i${@}
są identyczne, chociaż ten ostatni jest „bardziej poprawna” składni. Musisz używać nawiasów${@:2}
, ponieważ$@:2
jest niejednoznaczny i dlatego byłby interpretowany jako${@}:2
, co nie jest tym samym.Jest to
ksh
funkcja dostępna również wbash
najnowszych wersjachzsh
.W
ksh
ibash
można uzyskać dostęp do kilku elementów tablicy za pomocą${array[@]:first:length}
składni, która rozwija się dolength
(lub wszystkich, jeślilength
pominięto) elementówarray
tablicy (na liście elementów tablicy posortowanych numerycznie według indeksów), zaczynając od pierwszy z indeksem większym lub równymfirst
. W kontekście skalarnym (jak tutaj w przypisaniu do zmiennej skalarnej) lista elementów jest łączona znakami spacji zibash
orazksh93
pierwszym znakiem$IFS
(lub nic, jeśli$IFS
jest pusta lub spacją, jeśli nie jest ustawiona) zzsh
.Na przykład:
$@
to szczególny przypadek.$@
to tablica parametrów pozycyjnych ($1
,$2
...). Ale gdy jest używany z:
,$0
jest również uwzględniony. Więc${@:1}
jest taka sama jak$@
, nie${@:0}
tak jak na innych tablicach.W
zsh
nieco inaczej.zsh
dodanoksh
niedawno składnię dla kompatybilności, ale ma własną składnię do wybierania zakresów elementów.W przeciwieństwie do
ksh
ibash
,zsh
tablice są innego typu zmiennego niż zmienne skalarne, nie są rzadkie (zsh
ma 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]
(gdzielast
może być również ujemne, aby liczyć wstecz od końca).w
zsh
,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 zksh93
abash
,zsh
przyjmuje się również0
pierwszy 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.źródło