前言:我讨厌在一天内提出两个问题,但我有很多学习要做,而且我已经坚持了很长一段时间。我搜索了几个小时,似乎无法找到有效的解决方案。我已经无数次修改了这段代码,我只是无法让它工作。我只是在学习bash,语法对我来说很陌生。我确定我在下面的代码中犯了另一个noob错误。我似乎无法找到位置。
代码:
#!/bin/bash
ip=$1
first=$2
last=$3
if (( $first >= 1 && $first <= 255 && $last >= 1 && $last <= 255 && $first <= $last)); then
range=0
else
range=1
fi
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0]$ ]]; then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
VIP=0
else
VIP=1
fi
if (( $range == 0 && $VIP == 0)); then
echo "intiating ping scan for $1 $first-$last"
echo ""
echo "==================================================="
for i in $(seq $first $last); do ping -c 1 ${ip[0]}.${ip[1]}.${ip[2]}.$i > /dev/null;done
if [ $? -eq 0 ]; then
echo "${ip[0]}.${ip[1]}.${ip[2]}.$i is up"
else
echo "${ip[0]}.${ip[1]}.${ip[2]}.$i is down"
fi
else
echo "invalid IP or range"
echo "=================================================="
echo "Usage: ./ping_scan.sh <ip[must end in 0]{ex. 192.168.5.0}> "
echo "<start address {ex. 23}> <end address {ex. 254}>"
fi
我遇到的问题围绕着这段代码:
if (( $range == 0 && $VIP == 0)); then
echo "intiating ping scan for $1 $first-$last"
echo ""
echo "==================================================="
for i in $(seq $first $last); do ping -c 1 ${ip[0]}.${ip[1]}.${ip[2]}.$i > /dev/null;done
if [ $? -eq 0 ]; then
echo "${ip[0]}.${ip[1]}.${ip[2]}.$i is up"
else
echo "${ip[0]}.${ip[1]}.${ip[2]}.$i is down"
fi
else
echo "invalid IP or range"
echo "=================================================="
echo "Usage: ./ping_scan.sh <ip[must end in 0]{ex. 192.168.5.0}> "
echo "<start address {ex. 23}> <end address {ex. 254}>"
fi
我使用set -x来确认我的怀疑。我遇到的问题是我只接收上一个被ping的IP地址的输出。
for循环正在为每个IP运行,完成,获得$?对于最后一次ip ping,然后脚本进入if语句并打印最终IP的状态。
我需要为每个IP运行for循环,并为每个IP运行if语句并输出每个IP的状态,我知道这可以完成,并且我尝试了多个配置,但似乎没有工作。
任何建议或指向阅读内容的指针都将非常感激。
答案 0 :(得分:0)
if
语句需要在循环中。
for i in $(seq $first $last)
do
ping -c 1 ${ip[0]}.${ip[1]}.${ip[2]}.$i > /dev/null
if [ $? -eq 0 ]; then
echo "${ip[0]}.${ip[1]}.${ip[2]}.$i is up"
else
echo "${ip[0]}.${ip[1]}.${ip[2]}.$i is down"
fi
done