Bash:在FOR循环中突破IF循环

时间:2014-04-23 01:33:10

标签: arrays linux bash loops

我正在尝试组合FOR循环(迭代IP地址)和IF循环(在继续之前使用nc检查成功的ssh连接)。

我有一个数组$ {INSTANCE_IPS [@]},其中包含IP地址(目前它包含2个IP地址)。这是代码:

while [ $ITERATION -le 30 ]
do
    for instance in ${INSTANCE_IPS[@]}
    do    
        nc -w 2 $instance 22 > /dev/null
            if [ $? -eq 0 ]
            then echo "connection succeeded to $instance"
            else
                ITERATION=$((ITERATION+1))
                echo ITERATION=$ITERATION
                echo "[info] connection to $instance unsuccessful. trying again. iteration=$ITERATION"
                sleep 20
            fi
    done
done

'其他' IF循环中的语句工作正常。这是'然后'声明我遇到问题......一旦连接成功,我就不知道如何摆脱IF循环。这是我运行上述内容时的示例输出:

connection succeeded to 10.11.143.171
connection succeeded to 10.11.143.170
connection succeeded to 10.11.143.171
connection succeeded to 10.11.143.170
connection succeeded to 10.11.143.171
connection succeeded to 10.11.143.170

如果我在break之后使用then echo "connection succeeded to $instance,那么它只会迭代1个IP地址并且永远不会爆发:

connection succeeded to 10.11.143.171
connection succeeded to 10.11.143.171
connection succeeded to 10.11.143.171

理想情况下,我认为最好的办法是查询数组中元素的数量,然后执行netcat连接,将某个值增加1,直到它等于数组中元素的数量,但我'我真的不知道该怎么做。

感谢任何帮助:)如果您需要更多信息,请与我们联系。

干杯

1 个答案:

答案 0 :(得分:1)

重新制定你的逻辑。如果某些事情成功,你就无法破解,因为你不知道另一个项目是否会失败。

相反,请保留一个标记,说明您是否已成功完成所有这些操作,并在某些操作失败时将其设置为false。此时,你也可以休息等待。

ITERATION=0
all_succeeded=false
while [ "$all_succeeded" = "false" -a $ITERATION -le 30 ]
do
    all_succeeded=true
    for instance in ${INSTANCE_IPS[@]}
    do    
        nc -w 2 $instance 22 > /dev/null
        if [ $? -eq 0 ]
        then 
          echo "connection succeeded to $instance"
        else
          all_succeeded=false
          echo "[info] connection to $instance unsuccessful."
          sleep 20
          break
        fi
    done
    let ITERATION++
done

if [ "$all_succeeded" = "true" ]
then
  echo "It worked"
else
  echo "Giving up"
fi