【问题标题】:Bash 'if' statement in 'for' loop in an 'if' statement'if' 语句中的 'for' 循环中的 Bash 'if' 语句
【发布时间】:2017-03-06 22:25:34
【问题描述】:

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

代码:

#!/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

问题围绕着这段代码sn-p:

if (( $range == 0 && $VIP == 0)); then

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

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

我该如何解决?

【问题讨论】:

  • 您必须移动doneif 只有在您完成整个 for 循环后才会被触发。适当的缩进也会有所帮助。
  • 谢谢,又一个菜鸟错误。我很感激你的回应。我认为当我发布代码时会出现缩进问题。我仍在尝试找出堆栈溢出的代码块。
  • 您可以从编辑器中按原样复制粘贴所有内容,然后选择整个代码块并使用 Ctrl-K(或 {} 按钮)。
  • 太棒了。从现在开始我会这样做。我确实检查了压痕,你是对的,有一些错误。
  • 在未来,顺便说一句,请尝试遵循*.com/help/mcve 的指导方针——创建尽可能小的代码示例以重现您的问题。

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


【解决方案1】:

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

【讨论】:

  • 啊!太感谢了。 Noob 错误编号 2。我尝试删除 done 而没有想到它当然是必需的。我已经进行了您建议的更改,并且一切正常。非常感谢!
最近更新 更多