当前位置: 首页 > 知识库问答 >
问题:

如何在if语句中保留for循环,而不考虑退出代码

刘弘新
2023-03-14

我试图检查一个数组中的所有服务器,看看它们是否配置了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个答案

张德佑
2023-03-14

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

但是您也在检查ssh是否以一种非常奇怪的方式成功。除非有什么我不明白的地方,只要把ssh命令直接放在if条件中,并用

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

 类似资料:
  • 问题内容: 目前无法打破此循环。如果要在此列表中找不到变量,我想破坏它,以便它可以移动另外两个循环。它期望在循环的顶部有一个缩进的块,但是如果更改循环的开头或开头的位置,它将无法正常工作。救命! 问题答案: 正如人们在对您的问题的评论中提到的那样,您需要分别打破每个循环,仅停止其所在的循环 两个 循环都需要这样做 如果您也想打破while循环,那么您也可以添加该循环。

  • 我有一个380行20列的表格。我想从该表中删除符合特定条件的行。 为了澄清问题,假设我有以下列表: 我想删除在列表中找到姓名的所有人员的数据。 例如,假设我的数据如下所示: 我想删除、和的数据。所以输出应该是: 我的代码正在运行,但数据没有从我的原始数据中删除。当我打开新的测试.txt文件时,我可以看到数据没有被删除。 我可以肯定错误在< code > if data[row][0]= =(I f

  • 这是一些我更愿意自己解决的工作,所以如果可能的话,请不要直接给出答案,但也许可以给我指明正确的方向,为什么我会从循环输出中收到错误,为什么if语句不会产生输出。 你知道是什么导致了这一切吗?

  • 这个程序基本上允许用户输入任何单词,直到他/她输入单词“last”。 如果单词包含字母“s”,则应显示单词确实包含“s”或“s”,否则应显示单词不包含“s”或“s”。 示例:用户输入的单词= •约翰 詹姆斯 •馅饼 莎莉 结果: 约翰不包含's'或'S' James确实包含“s”或“s” 馅饼不含's'或'S' Sally不包含“s”或“s” 该程序可以工作,但我需要更改if语句,以便它使用equ

  • 由于某种原因,在我输入“停止”后,代码不会退出。为什么?逐步调试表明,在我输入“stop”后,它的值完全由“s”、“t”、“o”、“p”组成,没有任何换行符,等等。然而,代码仍然无法退出。谁能告诉我为什么吗?