我是 shell 编程的新手,正在尝试实现一些重试逻辑。由于某种原因,我的 till 循环没有退出。它挂在那里。任何帮助都值得感激。
#!/bin/bash
retry_cnt=0
until [ $retry_cnt -ge 3 ]; do
echo "current retry count - " $retry_cnt
time my command here
daily_stat=$?
if [ $daily_stat -eq 0 ]; then
break
fi
retry_cnt=$[$retry_cnt+1]
sleep 5
done
答案1
关于你的脚本的一些建议:
- 调用变量时使用括号,
_
在变量名称中使用括号调用变量,没有括号可能会出现错误,因为 bash 可能会将变量名解释为第一部分,在本例中:($retry
参见独立财务顾问在 tldp 上 - 使用让算术,它确实快速且易于理解。
- 使用双括号(
[[
),是单括号的演变(仅当您使用bash
和 而不是 时sh
)
尝试此版本的脚本:
/bin/bash #!/bin/bash 让 retry_cnt=0 直到 [[ ${retry_cnt} -ge 3 ]] ; 执行 echo "当前重试次数 - ${retry_cnt}" 在这里安排我的命令时间 每日统计=$? 如果 [[ ${daily_stat} -eq 0 ]] ; 那么 休息 菲 让 retry_cnt++ 睡 5 完毕
答案2
根据您对我的评论的回答,我猜测是您的未命名命令挂起了,而不是脚本本身。
验证这一点的方法是将标题行更改为:
#!/bin/bash -x
这将导致每个执行的命令在执行之前显示出来,因此您将看到导致挂起的命令。
在长脚本中,可能会产生大量不相关的输出,您可以保留标题行,而是通过在前面和后面添加以下行来跟踪脚本的特定部分:-
set -x
...
set +x