Мне нужно рассчитать подсеть, имея IP-адрес и маску сети в оболочке машины Solaris (bash, но может быть и другим).Рассчитать подсеть в оболочке Solaris
Некоторые примеры:
IP=192.168.100.6, MASK=255.255.255.0 => SUBNET=192.168.100.0
IP=11.95.189.33, MASK=255.255.0.0 => SUBNET=11.95.0.0
IP=66.25.144.216, MASK=255.255.255.192 => SUBNET=66.25.144.192
У меня есть два способа вычислить это:
SUBNET=$((`echo $IP | awk 'BEGIN { FS = "." } ; {print $1}'`&`echo $MASK | awk 'BEGIN { FS = "." } ; {print $1}'`)).\
$((`echo $IP | awk 'BEGIN { FS = "." } ; {print $2}'`&`echo $MASK | awk 'BEGIN { FS = "." } ; {print $2}'`)).\
$((`echo $IP | awk 'BEGIN { FS = "." } ; {print $3}'`&`echo $MASK | awk 'BEGIN { FS = "." } ; {print $3}'`)).\
$((`echo $IP | awk 'BEGIN { FS = "." } ; {print $4}'`&`echo $MASK | awk 'BEGIN { FS = "." } ; {print $4}'`))
и
l="${IP%.*}";r="${IP#*.}";n="${MASK%.*}";m="${MASK#*.}"
subnet=$((${IP%%.*}&${NM%%.*})).$((${r%%.*}&${m%%.*})).$((${l##*.}&${n##*.})).$((${IP##*.}&${NM##*.}))
Но я думаю, что оба из них немного "грязный". Мне нужен «более чистый» способ подсчета подсети, который легко понять другим людям в моем проекте.
Я предпочитаю не использовать Perl или питона, но можно было бы рассмотреть.
это работает только тогда, когда ф находится в первой подсети в основной сети. Например. он не работает для ip = "10.0.0.99" vmask = "255.255.255.196" – Kveri
@Kveri, какого результата вы ожидаете? – Kent
Извините, я имел в виду vip = "10.0.0.99" и vmask = "255.255.255.192". Результат, полученный вашим кодом, - SUBNET = 10.0.0.192. Правильный результат: 10.0.0.64 – Kveri