这是我的直到循环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
,它几乎可以是任何命令)这一事实使退出状态更改为零。