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

use*_*925 1 linux arrays 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

如果我使用breakafter then echo "connection succeeded to $instancethen 它只会迭代 1 个 IP 地址并且永远不会中断:

connection succeeded to 10.11.143.171
connection succeeded to 10.11.143.171
connection succeeded to 10.11.143.171
Run Code Online (Sandbox Code Playgroud)

理想情况下,我认为最好的办法是查询数组中的元素数量,然后执行 netcat 连接,将某个值增加 1,直到它等于数组中的元素数量,但我真的不确定如何点那个。

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

干杯

tha*_*guy 6

重新表述你的逻辑。如果某件事成功了,你就无法中断,因为你不知道另一件事是否会失败。

相反,保留一个标志来表明您是否已成功完成所有这些操作,如果失败则将其设置为 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
Run Code Online (Sandbox Code Playgroud)