如何修改Bash脚本以新增IP地址八位组生成四段IP?
四段IP地址主机名解析脚本修改方案
需求
修改现有Bash脚本,生成形如192.168.x.i的四段IP地址(x、i取值范围均为1-255),并解析对应主机名。原脚本仅支持接收前缀参数生成三段IP并解析。
现有脚本
IPPFX=$1 for i in `seq 1 255` ; do LIST="$LIST ${IPPFX}.$i" ; done for i in $LIST ; do ENTRY="`host $i`" [ $? -ne 0 ] && continue ENTRY=`echo "$ENTRY" | sed -e 's/.* //' -e 's/\.$//'` echo -e "$i\t$ENTRY" done
注:原脚本中echo "$ENTRY" l sed是输入错误,应为echo "$ENTRY" | sed。
你尝试的错误修改(问题点)
IPPFX=$1 for i in `seq 1 255` ; for j in `seq 1 255` do LIST="$LIST ${IPPFX}.$j.$i" ; done for i in $LIST ; for j in $LIST ; do ENTRY="`host $j.$i`" [ $? -ne 0 ] && continue ENTRY=`echo "$ENTRY" l sed -e 's/.* //' -e 's/\.$//'` echo -e "$j$i\t$ENTRY" done
存在的问题:
- Bash嵌套循环语法错误,外层循环缺少
do和闭合的done - 错误地把生成的IP列表再次拆分循环,导致IP重复拼接成错误格式
- 管道符写成了
l,属于输入错误
正确修改方案
直接用嵌套循环生成每一个四段IP,同时修正细节错误:
IPPFX=$1 # 遍历第三位(x)和第四位(i) for x in $(seq 1 255); do for i in $(seq 1 255); do IP="${IPPFX}.$x.$i" # 执行主机名解析 ENTRY=$(host "$IP") # 解析失败就跳过 if [ $? -ne 0 ]; then continue fi # 提取主机名并去掉末尾的点 ENTRY=$(echo "$ENTRY" | sed -e 's/.* //' -e 's/\.$//') # 输出IP和主机名,制表符分隔 echo -e "$IP\t$ENTRY" done done
额外优化说明
- 不用提前把所有IP存入LIST变量,直接循环生成,节省内存(255*255共65025个IP,存LIST会占用较多内存)
- 用
$(...)替代反引号,这是更规范的Bash写法,可读性更强 - 把判断逻辑写成
if语句,比单行&& continue更清晰易懂
内容的提问来源于stack exchange,提问作者Mr_Chmod
相关产品推荐
相关产品推荐

