Jeśli mam tablicę z 5 elementami, na przykład:
[a][b][c][d][e]
Za pomocą echo ${myarray[4]}
Widzę, co trzyma.
Ale co, jeśli nie znam liczby elementów w danej tablicy? Czy istnieje sposób odczytu ostatniego elementu tablicy o nieznanej długości? tj. Pierwszy element odczytuje od prawej do lewej dla dowolnej tablicy?
Chciałbym wiedzieć, jak to zrobić w bash.
$@
nie jest dokładnie tablicą (nie można go zapisać w indeksie). W tym celu zobacz Pobieranie ostatniego argumentu do skryptu powłoki .Odpowiedzi:
Możesz po prostu użyć indeksu ujemnego,
${myarray[-1]}
aby uzyskać ostatni element. Możesz zrobić to samo dla przedostatniego i tak dalej; w Bash:To samo działa również w przypadku przypisania. Kiedy mówi „wyrażenie”, naprawdę oznacza wyrażenie; możesz tam napisać dowolne wyrażenie arytmetyczne, aby obliczyć indeks, łącznie z tym, który oblicza, używając
${#myarray[@]}
jawnie długości tablicy .źródło
ksh
izsh
tak dobrze.zsh
choć domyślnie tablice są indeksowane 1, w przeciwieństwie dobash
iksh
gdzie są 0-indeksowane.Nowoczesne bash (wersja 4.1 lub nowsza)
Ostatni element możesz przeczytać na indeksie
-1
:Obsługa dostępu do tablic indeksowanych numerycznie od końca przy użyciu indeksów ujemnych rozpoczęła się od wersji bash 4.1-alfa .
Starsza wersja bash (wersja 4.0 lub wcześniejsza)
Musisz uzyskać długość tablicy od,
${#a[@]}
a następnie odjąć jedną, aby uzyskać ostatni element:Ponieważ bash traktuje indeksy tablicowe jako wyrażenie arytmetyczne, nie ma potrzeby stosowania dodatkowej notacji, na przykład w
$((...))
celu wymuszenia oceny arytmetycznej.źródło
modern
się do wersji.bash
przypisanie tablicy, odwołanie, rozbrojenie z indeksem ujemnym dodano tylko w bash 4.3 . W starszych wersjachbash
możesz używać wyrażeń w indeksiearray[${#array[@]-1}]
Innym sposobem jest także praca ze starszą wersją
bash
(bash 3.0 lub lepsza):lub:
Korzystanie ujemny offset, trzeba oddzielić
:
ze-
aby uniknąć pomylenia z:-
ekspansji.źródło
"${a[@]: -1}"
i będzie działać (opróczbash
izsh
) również wksh
.zsh
lubbash
; ale przetestowałem to we wszystkich trzech powłokach).szyk
Najstarsze alternatywy w bash (od wersji bash 3.0+) to:
Spacja jest wymagana, aby uniknąć interpretacji
:
następującego po niej znaku minus-
jako rozwinięcia"${var:-abc}"
(Użyj wartości domyślnych).~
Jest arytmetyka negacja bitowe (odpowiada jednemu uzupełnień lub odwrócić wszystkie bity ). From man bash:Od wersji bash-4.2 + również:
Od wersji bash 5.0+:
Dla wszystkich wersji bash (starsza bash):
@
Dla argumentów pozycyjnych (od wersji bash 2.01):
Przenośnym rozwiązaniem dla wszystkich powłok jest użycie eval:
źródło
~
w instrukcji i nie widziałem tego.$@
?bash: ${@[@]:(-1)}: bad substitution
man bash
odniesienie (sprawdź rozszerzoną odpowiedź w tytule @). @TomHale@
To nie tablica (no, nie w pełni tablicą ) w bash i nie akceptują index ([]
) indeks dla poszczególnych argumentów. Musisz użyć${@:(-1)}
lub ekwiwalentu. Sprawdź rozwinięty wpis przy@
tytule. @TomHaleMożesz także to zrobić:
Wynik:
To, co robisz, to uzyskanie całej liczby elementów w tablicy i odjęcie -1, ponieważ otrzymujesz wszystkie elementy, nie zaczynając od indeksu tablicy, który wynosi 0.
źródło