我正在尝试合并一个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
doneIF循环中的“works”语句工作良好。这是“当时”的陈述,我对此有异议.当连接成功后,我不知道如何摆脱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,那么它只遍历一个IP地址,永远不会出现如下情况:
connection succeeded to 10.11.143.171
connection succeeded to 10.11.143.171
connection succeeded to 10.11.143.171理想情况下,我认为最好的方法是查询数组中的元素数,然后执行netcat连接--某个值增加1,直到它等于数组中的元素数,但我真的不知道如何点这个值。
如果你需要更多的信息,请告诉我。
干杯
发布于 2014-04-23 01:43:20
重新制定你的逻辑。如果某件事情成功了,你就不能崩溃,因为你不知道另一个项目是否会失败。
相反,保留一个标记,说明您是否成功地完成了所有这些操作,如果有什么失败,则将其设置为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"
fihttps://stackoverflow.com/questions/23233274
复制相似问题