Widzę to w skrypcie powłoki.
variable=${@:2}
Co to robi?
Komentarze
Odpowiedź
To jest pokazując zawartość specjalnej zmiennej $@
w Bash. Zawiera ona wszystkie argumenty wiersza poleceń, a to polecenie pobiera wszystkie argumenty z drugiego i przechowuje je w zmiennej , variable
.
Przykład
Oto przykładowy skrypt.
#!/bin/bash echo ${@:2} variable=${@:3} echo $variable
Przykład uruchomienia:
./ex.bash 1 2 3 4 5 2 3 4 5 3 4 5
Referencje
Komentarze
- Zwróć uwagę, że pokazana technika łączy podane argumenty w jeden strunowy. Jeśli chcesz zachować je jako osobne argumenty, użyj tablicy:
vars=( "${@:2}" )
- @glennjackman – dziękujemy za wskazanie.
- Również zwróć uwagę na użycie nawiasów klamrowych. Powinieneś zawsze używać nawiasów klamrowych, ale Bash pozwala na ich pominięcie, gdy kontekst jest jednoznaczny. Dlatego
$@
i${@}
są identyczne, chociaż to drugie jest " bardziej poprawne " składnia. Musisz użyć nawiasów z${@:2}
, ponieważ$@:2
jest niejednoznaczne i dlatego zostanie zinterpretowane jako${@}:2
, a to nie to samo.
Odpowiedź
To „sa ksh
funkcję można również znaleźć w bash
i ostatnich wersjach zsh
.
W ksh
i bash
, możesz uzyskać dostęp do kilku elementów tablicy, używając składni ${array[@]:first:length}
, która rozwija się do maksymalnie length
(lub wszystkich, jeśli pominięto length
) elementów array
tablica (na liście elementów tablicy posortowanych numerycznie według indeksów), zaczynając od pierwszej z indeksem większym lub równym first
. W kontekście skalarnym (jak tutaj w przypisanie do zmiennej skalarnej) lista elementów jest połączona spacją ch znaki zawierające bash
i ksh93
oraz pierwszy znak $IFS
(lub nic, jeśli $IFS
jest puste lub spacja, jeśli nie jest ustawione) 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 przypadek specjalny. $@
to tablica parametrów pozycyjnych ($1
, $2
…). Ale gdy jest używany z :
, $0
jest również uwzględniany. Zatem ${@:1}
to to samo co $@
, a nie ${@:0}
jak w przypadku innych tablic.
W zsh
jest nieco inaczej. zsh
dodał ksh
ostatnio dla zachowania zgodności, ale ma własną składnię do wybierania zakresów elementów.
W przeciwieństwie do ksh
i bash
, zsh
tablice są zmiennymi innego typu niż zmienne skalarne, nie są rzadkie (zsh
ma tablice asocjacyjne jako inny typ zmiennej) i rozpocznij pod indeksem 1 zamiast 0.
Dla zsh
, uzyskujesz dostęp do zakresów 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ę zawierającą 235 elementów, z których większość jest pusta. $a[12,50]
rozwinie się do elementów od 12 do 50, a ${a[@]:12:2}
rozwinie się tylko do (pustego) $a[12]
i $a[13]
. Jako szczególny przypadek i ponownie dla przenośności z ksh93
i bash
, zsh
akceptuje również 0
pierwszy element dla $@
i traktuje go jako $0
.
Możesz więc używać ${a[@]:x:n}
i ${@:x:n}
przenośnie we wszystkich 3 powłokach, ale tylko dla nierzadkich tablic i zwróć uwagę na wartość IFS.
Komentarze
- Dziękujemy za wyjaśnienie składni indeksowania tablic
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Widzisz różnicę?