arrays - Bash:在 FOR 循环中跳出 IF 循环

标签 arrays linux bash loops

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

我有一个包含 IP 地址的数组 ${INSTANCE_IPS[@]}(目前它包含 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 循环中的“else”语句工作正常。这是我遇到问题的“then”语句...一旦连接成功,我不知道如何跳出 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 然后 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,直到它等于数组中的元素数量,但我真的不确定如何打点。

感谢任何帮助 :) 如果您需要更多信息,请告诉我。

干杯

最佳答案

重新制定您的逻辑。如果某件事成功了,您就不能中断,因为您不知道另一件事是否可能会失败。

相反,保留一个标志说明您是否已成功完成所有这些,如果失败则将其设置为 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

关于arrays - Bash:在 FOR 循环中跳出 IF 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23233274/

相关文章:

c++:本地数组定义与 malloc 调用

javascript - 过滤和克隆对象属性

ios - 按值 Swift 将数组拆分为数组

c - 如何初始化二维字符数组的内容?

python - 在 python 中查找命令失败,出现 "missing argument to -exec"

bash - awk:在列中找到最小值和最大值

linux - 在 unix 中并行运行多个命令

linux - 有人可以帮我将每小时和每天的日志文件分成一个单独的文件吗?

linux - Supervisord 事件只发送给池中的一个事件监听器

bash - 在 bash 中减去大数