【发布时间】:2014-04-23 01:33:10
【问题描述】:
我正在尝试组合一个 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
如果我在then echo "connection succeeded to $instance 之后使用break,那么它只会遍历 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,直到它等于数组中的元素数量,但我真的不知道怎么加点。
感谢任何帮助 :) 如果您需要更多信息,请告诉我。
干杯
【问题讨论】:
-
你想打破这两个循环 - 一旦你发现一个工作就停止?如果是这样,您可以将 $ITERATION 设置为 30,然后调用 break
-
“IF 循环”我假设您的意思是“IP 循环”?但也许你没有。没有“if循环”之类的东西。
-
@ Jerry - 所以我想确保对阵列中的所有元素(IP 地址)都建立了成功的 ssh 连接。因此,如果有 2 个 IP 地址,我想确保在退出 for 循环并继续使用 bash 脚本之前建立了两个成功的连接(每个 IP 地址一个)
-
@ooga - 不,我只是说“如果”。对不起,我的术语错误。我只是说我将 IF 嵌套在 FOR 循环中。