直到循环结束时退出1

直到循环结束时退出1

这是我的直到循环bash脚本,尝试在远程计算机上执行 ssh 命令:

n=0
until [ ${n} -ge 5 ]
do
   ssh -oStrictHostKeyChecking=no root@test "mkdir -p /test_dir" && break 
   n=$(($n+1))
   sleep 5
done

我希望当循环结束但没有成功时执行 exit 1 。

我找到了这个解决方案:

n=0
until [ ${n} -ge 5 ]
do
   ssh -oStrictHostKeyChecking=no root@test "mkdir -p /test_dir" && exit 0 
   n=$(($n+1))
   sleep 5
done
exit 1

是正确的方法吗?

答案1

这是一种方法。

另一种方法是这样做:

until [ "$n" -ge 5 ] && exit 1; do
  ... && break
done
echo OK
exit 0

或者:

while [ "$n" -lt 5 ] || exit; do
  ... && break
done

虽然在这里,您似乎想重复该ssh命令直到成功,并在多次尝试后中止,因此:

n=5
until
  ssh -oStrictHostKeyChecking=no root@test "mkdir -p /test_dir"
do
  n=$((n - 1))
  if [ "$n" -eq 0 ]; then
    echo >&2 giving up
    exit 1
  fi
done

echo OK
exit 0

会更有意义。

答案2

如果您将循环结束“未成功”分类为循环完成循环,那么是的,当发生这种情况时,退出代码将为 1。

您编写的脚本刚刚以退出代码 1 结束。如果它永远循环,那么您显然永远不会获得退出代码 1。

退出代码所做的只是告诉您上次运行命令是否成功。

如果您帖子中的脚本完成循环并结束,请尝试随后立即运行此命令:

echo $?

然后再跑echo $?。你看到了什么?你认为为什么会改变?您现在可能已经明白了:您成功运行命令(在本例中echo,它几乎可以是任何命令)这一事实使退出状态更改为零。

相关内容