Mam dwie tablice:
arrayA=(1 2 3)
arrayB=(a b c)
i chcę wydrukować jeden z nich za pomocą argumentu wiersza poleceń, tzn. bez żadnego if else
.
Wypróbowałem kilka odmian składni bez powodzenia. Chcę zrobić coś takiego:
ARG="$1"
echo ${array${ARG}[@]}
ale pojawia się błąd „złej zamiany”. Jak mogę to osiągnąć?
Odpowiedzi:
Spróbuj to zrobić:
UWAGA
man bash
(rozszerzenie parametru):źródło
!
robi się przedvar
zmienną? Jak to działa, wydawało się, że jest to podstawienie historii w google, ale nie widziałem, jak to działa.Chociaż możesz użyć dostępu pośredniego, jak wskazano w innej odpowiedzi , innym sposobem (w ksh i Bash 4.3 i nowszych) byłoby użycie namerefs. Zwłaszcza w przypadku tablic może to być bardziej przydatne, ponieważ można indeksować tablicę przez nazwę i nie trzeba umieszczać indeksu w zmiennej używanej jako odwołanie.
To nie działa poprzez pośredni dostęp:
Jak ująłby to programista C,
${!q[1]}
tutaj działa jakq
tablica wskaźników, a nie wskaźnik do tablicy.źródło
Uwaga: eskapuj cotes w przypadku miejsca !
źródło
Zajęło to wiele prób i błędów, ale ostatecznie zadziałało.
Czerpałem inspirację z Youness. Ale wszystkie inne odpowiedzi nie pomogły w moim starym bashu (suse11sp1 [wydanie 3.2.51 (1)])
Pętla „for” odmówiła rozwinięcia tablicy pośredniej, zamiast tego należy ją wstępnie rozwinąć, użyć jej do utworzenia kolejnej tablicy z nową nazwą zmiennej. Mój przykład poniżej pokazuje podwójną pętlę, ponieważ jest to moje zamierzone zastosowanie.
Używam #, aby usunąć „New_” z pierwszego wpisu tablicy, a następnie połączyć się z „Things”, aby uzyskać „FOOthings”. \ $ {} z echo i eval, a następnie wykonaj swoje czynności bez zgłaszania błędów, które są zawinięte w nową $ () i przypisane nowej nazwie zmiennej.
AKTUALIZACJA ##### 2018/06/07Niedawno odkryłem jeszcze jedną kwestię dotyczącą tego problemu. Utworzona zmienna nie jest w rzeczywistości tablicą, ale ciągiem rozdzielanym spacjami. W przypadku powyższego zadania było to w porządku, ponieważ ze względu na sposób działania „for” nie odczytuje tablicy, jest rozszerzana, a następnie zapętlana, patrz wyciąg poniżej:
Ale potem musiałem użyć go jako tablicy. W tym celu musiałem wykonać jeszcze jeden krok. Wziąłem dosłownie kod Dennisa Williamsona . Przetestowałem to i działa dobrze.
„IFS =”, ”to zmienna zawierająca ogranicznik. „czytaj” za pomocą „-a” odcina i podaje żądło z powrotem do zmiennej tablicowej. Uwaga, to nie ma szacunku dla cudzysłowie, ale istnieje kilka opcji w odczycie , aby poradzić sobie z tym, na przykład, że usunęliśmy flagi -r czego nie potrzebujesz. Więc połączyłem ten dodatek w tworzeniu zmiennych, co pozwala na przetwarzanie danych i adresowanie ich tak, jak powinno.
źródło
W ten sposób utworzyłbyś zmienną o nazwie dynamicznej (wersja bash <4.3).
Poniżej znajduje się grupa funkcji, których można użyć do zarządzania tablicami o nazwach dynamicznych (wersja bash <4.3).
Poniżej znajduje się grupa funkcji, których można użyć do zarządzania tablicami o nazwach dynamicznych (wersja bash> = 4.3).
Aby uzyskać więcej informacji na temat tych przykładów, odwiedź stronę Getting Bashed by Dynamic Arrays autorstwa Ludvika Jerabka
źródło
nie ma mowy :(
jeśli twoje tablice są takie proste, użyj tablic asocjacyjnych
niestety, jeśli twoje tablice są bardziej skomplikowane (na przykład
array=( "a b" c )
), to nie zadziałałoby. Następnie musisz się zastanowić nad innym sposobem na osiągnięcie celu.źródło
Posługiwać się
eval
źródło