在bash中嵌套for循环

时间:2017-04-08 01:03:20

标签: bash loops sleep

我在for shell脚本中有一对嵌套的bash循环。

当计数器达到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在循环中不起作用,或者我没有正确使用它?是否有另一种方法可以暂停脚本而不会将嵌套循环分解为单独的包装脚本?

1 个答案:

答案 0 :(得分:1)

我认为你的测试是错误的。试试这个:

if (( counter % 50 == 0 ))

$counter%50部分永远不会扩展为0,因此此测试将始终失败,并且永远不会执行睡眠。 %模运算符需要算术上下文,标准测试命令不提供,但双括号将为。