Ну, @uint128_t поймал ошибку.
Ваш скрипт пытается попытаться распечатать все IP-адреса в пределах 192.168.0.0/16, а не всех сетей класса C с этим префиксом, поэтому я буду считать, что ваш код является лучшим описанием результата, который вы «Ищем.
И я представить следующее в качестве «лучшего использования Баш»:
#!/usr/bin/env bash
# Declare an array
ip=(192 168 -1 -1)
# Step through the third quad in the array
while [ $((ip[2]++)) -lt 255 ]; do
# Step through the fourth quad in the array
while [ $((ip[3]++)) -lt 255 ]; do
# Print the array, with dots as a field separator
IFS=. eval echo '"${ip[*]}"'
done
# Reset the last quad once we're done with this subnet
ip[3]=-1
done
Там будут те, кто говорит, что eval
это зло, но это совершенно безопасно в этом контексте, где входные данные и вы защищаете вещи одинарными кавычками.
Это решение позволяет избежать дополнительных счетчиков и, возможно, дает вам возможность делать другие вещи с помощью ваших IP-адресов, если вы этого хотите.
Следует упомянуть еще одну тонкость, которая составляет [ $((ip[2]++)) -lt 255 ]
. Это увеличивает элемент массива, но потому, что ++
ПОСЛЕ переменной, значение, которое используется для сравнения (-le
), является значением, которое предшествует приращению. Таким образом, мы останавливаем цикл, когда сравниваемое число меньше 255, потому что это означает, что последний прогон цикла произойдет, когда переменная увеличится на один выше, до 255.Если по какой-то причине вы хотели бы сравнить значение после инкремента, а не раньше, вы можете добавить переменную ++
вместо ее добавления: $((++ip[2]))
.
Другой забавный подход может извлечь выгоду из того, что IP-адреса просто числа, и что пунктирные квадроциклы являются переводом этого номера:
#!/usr/bin/env bash
# Set your start and maximum IPs as integers
ip=$((192*2**24 + 168*2**16))
max=$((ip + 255*2**8 + 255))
# Convert each integer into dotted quad notation
while [ $ip -le $max ]; do
echo $((ip/2**24)).$((ip/2**16 %256)).$((ip/2**8 % 256)).$((ip % 256))
((ip++))
done
Обратите внимание, что '' '' не требуется внутри конструкции с двойными скобками. Например. '$ ((count1 + 1))' работает отлично. – vastlysuperiorman
Обратите внимание, что при запуске скриптов в режиме совместимости POSIX с использованием '#!/Bin/sh', это означает, что они будут переносимыми. В ответе ниже предлагается использовать '{0..255}'. В то время как BASH будет расширяться, другие реализации POSIX/bin/sh, вероятно, не будут. Если вы пишете для bash, лучше использовать '#!/Usr/bin/env bash' как ваш shebang. Если вы пишете для переносимости, лучше не использовать багизмы. – ghoti
Интригует, что первые два цикла 'while' отвечают на сброс' count2' после завершения внутреннего 'while'. Я бы установил его до того, как он запустится (и не до начала внешнего цикла). Но обе техники достигают того же результата. –