0

我在通宵脚本中遇到了循环问题。所以我得到了一个大脚本,为所有基地运行夜间转储然后开始一些任务,第二天需要开始什么,因为他们正在比较基地中的信息并对其进行一些更改。该脚本从 00:35 开始,需要到第二天早上 6:00 结束。但是基地越来越大,及时结束它的唯一理由是比现在更早地开始倾销基地。所以我做了一些改进,我在互联网上找到了什么,并在脚本中添加了一个循环来检查新的一天是否开始:

while [ $(date "+%H") -ge 21 ]; do
    echo "`date` - NOT OK" >> /tfiles/Log/logtest.txt
    sleep 120
done
echo "`date` - OK" >> /tfiles/Log/logtest.txt

一个问题是——这个循环是否有效,如果基地倾倒足够长的时间可以到达第二天。我的意思是 - 如果我们在 21:00 开始这个脚本,转储在 00:10 结束,然后循环检查它是哪一天,然后开始等到第二天。

还有一个问题,我找不到,选项 -ge 21 是什么意思?

总而言之,脚本如下所示:

  1. 21:00 开始

  2. 倾倒

  3. 循环检查它是否到达第二天

  4. 等到第二天

  5. 第二天需要开始的工作

  6. 运行类似的脚本结束

4

2 回答 2

0

我并不完全理解这个问题,但至少这部分是:

-ge 在 man bash 中有解释:

arg1 OP arg2 OP 是 -eq、-ne、-lt、-le、-gt 或 -ge 之一。如果 arg1 分别等于、不等于、小于、小于或等于、大于或大于或等于 arg2,则这些算术二元运算符返回 true。Arg1 和 arg2 可以是正整数或负整数。

于 2020-04-10T11:12:31.523 回答
0

你这段时间的情况是

while [ $(date "+%H") -ge 21 ]

这就是说“只要[(的别名test)返回true,就循环这个。” test用于-ge检查左操作数 ( $(date "+%H")) 是否大于或等于右操作数 (21)。

date读取它的参数 ,"+%H"作为格式说明符,将输出指定为仅小时,以 24 小时格式,所以在晚上 9 点它将报告 21。测试将是真的,所以它将进入循环,打印到日志文件,然后休眠两个分钟。晚上 10 点是 22 点,晚上 11 点是 23 点,所以到午夜应该可以正常工作。

午夜时分变为 00,因此测试失败,循环中断。

我认为您真正想要的是crontab定义所需行为的条目 - 参见手册

于 2020-04-10T13:19:10.493 回答