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ż $@:2
jest niejednoznaczny i dlatego byłby interpretowany jako ${@}:2
, co nie jest tym samym.
Jest to ksh
funkcja dostępna również w bash
najnowszych wersjach zsh
.
W ksh
i bash
moż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 length
pominięto) elementów array
tablicy (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 bash
oraz ksh93
pierwszym znakiem $IFS
(lub nic, jeśli $IFS
jest 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 :
, $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
dodano ksh
niedawno składnię dla kompatybilności, ale ma własną składnię do wybierania zakresów elementów.
W przeciwieństwie do ksh
i bash
, 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]
(gdzie last
moż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 ksh93
a bash
, 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.