尽管if语句中有退出代码,如何保持for循环

时间:2018-08-12 04:49:27

标签: linux bash

我正在尝试检查阵列中的所有服务器,以查看它们是否配置了SSH无密码信任。 如果不是,我想打印服务器详细信息,并不断遍历数组元素(ips),直到所有元素都被检查为止。
(我想有机会在退出之前打印出所有错误的内容。)

我尝试了以下方法,但是在遇到第一个未配置的服务器后,它退出了循环:

for svr in "${table[@]}"
do
SSH=$(ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=no $svr echo)

if $(echo [ $? -ne 0 ])
then echo "Trust is not configured for ${table[$svr]}"
    exit "$SOME"
else 
    :
fi
done

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

好吧,直接的问题是循环中间有一个exit命令...实际上,当脚本到达该点时,它将退出脚本。如果您不希望它在循环完成之前退出,请将exit命令放在之后。

但是您还要检查ssh是否以真的怪异的方式成功。除非涉及到我不了解的东西,否则只需将ssh命令直接置于if条件下,并用>/dev/null 2>&1放弃其输出:

for svr in "${table[@]}"
do
    if ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=no $svr echo >/dev/null 2>&1
    then
        echo "Trust is not configured for $svr"
    fi
done

exit "$SOME"

请注意,我还固定了对${table[$svr]}的引用(这没有任何意义),并删除了else子句(没有执行任何操作)。另外,$SOME是什么?

编辑:如果要在任何服务器连接失败时退出它,则需要在循环运行时跟踪是否有失败,然后使用它来控制它是否最后退出。

failures=0
for svr in "${table[@]}"
do
    if ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=no $svr echo >/dev/null 2>&1
    then
        echo "Trust is not configured for $svr"
        ((failures++))
    fi
done

if ((failures>0))
then
    exit
fi