在 bash 中的嵌套 for 循环中休眠
Sleeping within nested for loops in bash
我在 bash
shell 脚本中有一对嵌套的 for
循环。
我想在计数器达到 50 "ticks" 的倍数或迭代时每 60 秒暂停一次脚本,因此我进行了模测试:
counter=1
for ((i=0; i<${#libraries[@]}; i++)); do
for ((j=(i+1); j<${#libraries[@]}; j++)); do
# do stuff...
if [ $counter%50 == 0 ]; then
sleep 60s
fi
counter=$[$counter+1]
done
done
此循环行为不稳定 — 具体来说,此脚本不会每 50 次迭代暂停一次,但偶尔会错开并大部分会跳过,否则似乎不会正确触发预期的 sleep
调用。
无论我在 # do stuff...
中输入什么,此脚本都不会按预期暂停,而是以大致相同的不稳定方式运行。我可以将其注释掉 — 同样的行为。
${#libraries[@]}
只是一个文件路径数组。
sleep
是不是在循环中不起作用,还是我没有正确使用它?有没有其他方法可以在不将嵌套循环分解为单独的包装脚本的情况下暂停脚本?
我认为你的测试是错误的。试试这个:
if (( counter % 50 == 0 ))
$counter%50
部分永远不会扩展到0
,所以这个测试总是会失败,sleep永远不会执行。 %
模运算符需要算术上下文,标准测试命令不提供,但双括号会。
我在 bash
shell 脚本中有一对嵌套的 for
循环。
我想在计数器达到 50 "ticks" 的倍数或迭代时每 60 秒暂停一次脚本,因此我进行了模测试:
counter=1
for ((i=0; i<${#libraries[@]}; i++)); do
for ((j=(i+1); j<${#libraries[@]}; j++)); do
# do stuff...
if [ $counter%50 == 0 ]; then
sleep 60s
fi
counter=$[$counter+1]
done
done
此循环行为不稳定 — 具体来说,此脚本不会每 50 次迭代暂停一次,但偶尔会错开并大部分会跳过,否则似乎不会正确触发预期的 sleep
调用。
无论我在 # do stuff...
中输入什么,此脚本都不会按预期暂停,而是以大致相同的不稳定方式运行。我可以将其注释掉 — 同样的行为。
${#libraries[@]}
只是一个文件路径数组。
sleep
是不是在循环中不起作用,还是我没有正确使用它?有没有其他方法可以在不将嵌套循环分解为单独的包装脚本的情况下暂停脚本?
我认为你的测试是错误的。试试这个:
if (( counter % 50 == 0 ))
$counter%50
部分永远不会扩展到0
,所以这个测试总是会失败,sleep永远不会执行。 %
模运算符需要算术上下文,标准测试命令不提供,但双括号会。