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

Widzę to w skrypcie powłoki.

variable=${@:2} 

Co to robi?

Komentarze

  • Czy dokładnie tak to pokazało w skrypcie? Składnia wygląda jak tablica, ale brakuje niektórych elementów. Czy możesz opublikować kilka linii wokół tej linii ze skryptu?
  • To jest zmienna zaczynająca się od drugiej litery. var="my_value"; echo var="${var[@]:2}"; echo "$var" Widzisz różnicę?

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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *