【问题标题】:Bash: Breaking out of IF loop in FOR loopBash:在 FOR 循环中跳出 IF 循环
【发布时间】: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 循环中。

标签: arrays linux bash loops


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多