Bash If if语句中的for循环语句

时间:2017-03-06 22:25:35

标签: bash if-statement for-loop nested-loops

前言:我讨厌在一天内提出两个问题,但我有很多学习要做,而且我已经坚持了很长一段时间。我搜索了几个小时,似乎无法找到有效的解决方案。我已经无数次修改了这段代码,我只是无法让它工作。我只是在学习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的状态,我知道这可以完成,并且我尝试了多个配置,但似乎没有工作。

任何建议或指向阅读内容的指针都将非常感激。

1 个答案:

答案 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