如何使脚本退出,退出代码为1,但仅在循环的最后一次迭代之后



我想通过访问;健康检查";链接,所以我想实现以下逻辑:如果它返回200,则脚本停止使用exit code 0,但如果它返回其他内容,则脚本终止使用exit code 1,但我想测试";健康检查";连续链接3次。所以我做了这个

#!/bin/bash
n=0
until [ "$n" -ge 3 ]
do
i=`curl -o /dev/null -Isw '%{http_code}n' localhost:8080`
if [ "$i" == "200" ]
then
echo "Health check is OK"
break
else
echo "Health check failed"
fi
n=$((n+1))
sleep 5
done

当它是200并且触发了break时,它会以exit code 0退出,这很好,但如果它不是200,而是在until循环的第三次迭代之后,我也希望它以exit code 1退出。如果我将CCD_ 10添加到";if语句";脚本以CCD_ 11退出,但在第一次迭代之后。

有没有办法让它在循环的第三次迭代后用exit code 1退出?

当健康检查通过时,您可以立即在循环内exit 0,并在循环后exit 1

n=0
until [ "$n" -ge 3 ]
do
i=`curl -o /dev/null -Isw '%{http_code}n' localhost:8080`
if [ "$i" == "200" ]
then
echo "Health check is OK"
exit 0
else
echo "Health check failed"
fi
n=$((n+1))
sleep 5
done
exit 1

有没有办法让它在循环的第三次迭代后退出,退出代码为1?

如果我们总是想要exit 1,如果导致!= 200的任何请求,我们可以使用一个简单的标志:

  • 如何在shell脚本中声明和使用布尔变量
#!/bin/bash
n=0
failed=false
until [ "$n" -ge 3 ]
do
i=`curl -o /dev/null -Isw '%{http_code}n' localhost:8080`
if [ "$i" == "200" ]
then
echo "Health check is OK"
else
echo "Health check failed"
failed=true
fi
n=$((n+1))
sleep 5
done
if [ "$failed" = true ] ; then
exit 1
else
exit 0
fi

一些缩短代码的额外提示:

  • 我们可以通过使用for循环来移除n变量
  • 如果要退出
#!/bin/bash
failed=false
for (( i = 0; i < 3; i++ )); do
r=`curl -o /dev/null -Isw '%{http_code}n' localhost:8080`
if [ "$r" == "200" ]; then
echo "Health check is OK"
else
echo "Health check failed"
failed=true
fi
sleep 5
done
[[ "$failed" = true ]] && exit 1 || exit 0

参见#>>>注释:

#!/bin/bash
n=0
#>>> default status if never successful
status=1
until [ "$n" -ge 3 ]
do
i=`curl -o /dev/null -Isw '%{http_code}n' localhost:8080`
if [ "$i" == "200" ]
then
echo "Health check is OK"
#>>> successful: set status to 0
status=0
break
else
echo "Health check failed"
fi
n=$((n+1))
sleep 5
done
#>>> exit with $status
exit $status

如果在循环结束前设置状态,则不需要额外的布尔变量。因此,将您的计数器更新和睡眠计时器移动到失败的检查分支:

#!/usr/bin/env sh
n=0
until [ "$n" -ge 3 ]; do
i=$(curl -o /dev/null -Isw '%{http_code}n' localhost:8080)
if [ "$i" -eq 200 ]; then
echo "Health check is OK"
break
else
echo "Health check failed"
n=$((n + 1))
sleep 1
false # Set status to false
fi
done
#!/bin/sh
c=3
until
i=$(curl -Isw '%{http_code}' -o /dev/null localhost:8080)
[ "$i" = 200 ]
do
echo 'Health check failed' >&2
[ "$c" -gt 1 ] || exit
c=$((c-1))
sleep 5
done
echo 'Health check is OK' >&2

通过这种方式重构循环(即until <success> ...(,计数器变量的状态可以用于在最后一次尝试后退出。计数器从n开始并向零递减简化了变量的使用和测试。此外,避免了第n次故障后的sleep 5

最新更新