Widzę to w skrypcie powłoki.
variable=${@:2}
Co to robi?
var="my_value"; echo var="${var[@]:2}"; echo "$var"Zobacz różnicę?
Widzę to w skrypcie powłoki.
variable=${@:2}
Co to robi?
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 zmiennej variable.
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
vars=( "${@:2}" )
$@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.
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.