我需要计算子网,在Solaris机器 shell (bash,但可以是其他)中有IP地址和网络掩码。
一些例子:
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 或 python,但可以考虑。
2条答案
按热度按时间flmtquvp1#
假设您将ip和mask存储到两个shell变量中:
$ip
和$mask
:将以格式给予结果:
SUBNET=xxx.xxx.xxx.xxx
举一个例子:
xxls0lw82#
我的解决方案做了实际需要做的事情。IP和面具是“和”艾德一起的。这是我用过的。
这里假设$ip和$mask是定义的shell变量。
压缩:
工作原理类似于肯特给出的例子。
示例: