2016-10-29 28 views
11

Potrzebuję listy adresów IP od 130.15.0.0 do 130.15.255.255. Próbowałem tego, ale zdałem sobie sprawę, że utworzy 255 list. Czy ktoś może mi pomóc rozwiązać ten problem?Dołącz elementy do tablicy - pętla

for ((i = 0; i <= 255; i++)) ; do 
for ((j = 0; j <= 255; j++)) ; do 
LIST="$LIST 130.15.$i.$j" 
done 
done 
+3

Czy możesz dodać uzyskane wyniki i wyjaśnić, dlaczego nie jest to oczekiwana wydajność? –

+2

Wygląda na to, że tworzy 256 * 256 = 65536 adresów IP. Co jest nie tak? –

+0

@Benjamin W. odpowiada na problem KU z elegancją, ale odpowiedź na pytanie KU można znaleźć tutaj (spoiler: 'LIST + = (" 130.15. $ I. $ J ")' z 'declare -a LISTA =() 'powyżej pętli) http://unix.stackexchange.com/questions/211395/in-a-loop-over-an-array-add-an-el ement-to-the-array – duanev

Odpowiedz

25

Powiedziałbym, że podejście działa, ale jest bardzo powolny . Można użyć rozwijanie nawiasów Zamiast:

echo 135.15.{0..255}.{0..255} 

Albo, jeśli chcesz wynik w zmiennej, wystarczy przypisać:

list=$(echo 135.15.{0..255}.{0..255}) 

Jeśli chcesz adresów w tablicy można pominąć echo i Zmiana polecenie:

list=(135.15.{0..255}.{0..255}) 

teraz list jest odpowiednia macierz:

$ echo "${list[0]}"     # First element 
135.15.0.0 
$ echo "${list[@]:1000:3}"    # Three elements in the middle 
135.15.3.232 135.15.3.233 135.15.3.234 

Komentarze kodzie:

  • Zamiast

    list="$list new_element" 
    

    łatwiej jest dołączyć do łańcucha z

    list+=" new_element" 
    
  • Jeśli chcesz dołączyć do tablicy w pętli użyłbyś

    list+=("new_element") 
    
  • Wielkie nazwy zmiennych nie są zalecane, ponieważ są one bardziej prawdopodobne, aby kolidować ze zmiennych środowiskowych (patrz POSIX spec, paragraf cztery)

w rzeczywistości, na moim komputerze, zajmuje prawie sześć minut – rozszerzenie nawiasów trwa mniej niż 0,1 sekundy!

Powiązane problemy