Bash 'if' statement in 'for' loop in an 'if' statement

Bash 'if' statement in 'for' loop in an 'if' statement

我无法让下面的代码工作。

代码:

#!/bin/bash

ip=
first=
last=

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  $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 "initiating ping scan for  $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 address 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 地址 运行ning,完成,获取 $?对于最后一个 ping 的 IP 地址,然后脚本进入 if 语句并打印最终 IP 地址的状态。

我需要 for 循环到每个 IP 地址的 运行 和 if 语句到每个 IP 地址的 运行 并输出每个 IP 地址的状态。我知道这是可以做到的,我已经尝试了多种配置,但 none 似乎有效。

我该如何解决?

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