我正在尝试组合一个 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
如果我在 之后使用
那么它只会迭代 1 个 IP 地址并且永远不会中断:break
然后 echo "connection succeeded to $instance
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/