我有一项任务,需要从API中提取数据。我需要指定只收集数据之间的上午7点至晚上9点之间的每一天在给定的一个月。
这将是一个Bash脚本,它将在每个月1日的00:01上使用cron运行。
API只接受时代时期的时间。脚本需要足够的灵活性,这样我就不必在一年中的每一天都编写代码了。
我在这个问题上有问题。我可以得到一个月的第一天,划时代的时间是早上7点,划时代的时间是晚上9点,API将接受这两个划时代的值,并在2次之间查看。
我也可以得到这个月的最后一天,划时代的时间是早上7点,晚上9点。
我不知道的是,从这个月的第一天到最后一天,从早上7点到晚上9点。
START_LAST_MONTH=$(date "+%Y-%m-01" -d "-1 Month");
START_DAY_SEVEN_AM_EPOCH_DATE=$(date +%s -d"$START_LAST_MONTH 7am");
START_DAY_NINE_PM_EPOCH_DATE=$(date +%s -d"$START_LAST_MONTH 9pm");
END_LAST_MONTH=$(date "+%Y-%m-%d" -d "$START_LAST_MONTH +1 month -1 day");
END_DAY_SEVEN_AM_EPOCH_DATE=$(date +%s -d"$END_LAST_MONTH 7am");
END_DAY_NINE_PM_EPOCH_DATE=$(date +%s -d"$END_LAST_MONTH 9pm");我认为实现这一目标的一种方法是在7点和9点的START_DAY变量上增加86400秒,这样就可以创建新的变量,然后每天向上递增,直到END_DAY 7点和9 am的时间变量被击中。这应该是灵活的,然后每个月,因为在一个月的天数不同。
但这超出了我的bash脚本技巧,我希望学习如何实现这一点,因此任何帮助都会感谢,从另一个角度来看这也是很好的。
更新:
我现在有一个bash脚本
#!/bin/sh -x
START_LAST_MONTH=$(date "+%Y-%m-01" -d "-1 Month");
START_DAY_SEVEN_AM_EPOCH_DATE=$(date +%s -d"$START_LAST_MONTH 7am");
START_DAY_NINE_PM_EPOCH_DATE=$(date +%s -d"$START_LAST_MONTH 9pm");
END_LAST_MONTH=$(date "+%Y-%m-%d" -d "$START_LAST_MONTH +1 month -1 day");
END_DAY_SEVEN_AM_EPOCH_DATE=$(date +%s -d"$END_LAST_MONTH 7am");
END_DAY_NINE_PM_EPOCH_DATE=$(date +%s -d"$END_LAST_MONTH 9pm");
until [ $END_DAY_SEVEN_AM_EPOCH_DATE ]
do
let ADD_ONE_DAY=$START_DAY_SEVEN_AM_EPOCH_DATE+86400
echo $ADD_ONE_DAY
done但是它根本不回ADD_ONE_DAY变量。在使用-X进行调试时,它可以达到以下目的:直到$END_DAY_SEVEN_AM_EPOCH_DATE不再做任何进一步的事情。
发布于 2019-08-15 18:23:16
更新后的示例代码的问题是,在循环条件下,您实际上只检查$END_DAY_SEVEN_AM_EPOCH_DATE不为空--这只是在上面设置了两行,因此循环体永远不会执行。
要使示例按预期工作,请尝试以下修改:
#!/bin/sh -x
START_LAST_MONTH=$(date "+%Y-%m-01" -d "-1 Month");
START_DAY_SEVEN_AM_EPOCH_DATE=$(date +%s -d"$START_LAST_MONTH 7am");
START_DAY_NINE_PM_EPOCH_DATE=$(date +%s -d"$START_LAST_MONTH 9pm");
END_LAST_MONTH=$(date "+%Y-%m-%d" -d "$START_LAST_MONTH +1 month -1 day");
END_DAY_SEVEN_AM_EPOCH_DATE=$(date +%s -d"$END_LAST_MONTH 7am");
END_DAY_NINE_PM_EPOCH_DATE=$(date +%s -d"$END_LAST_MONTH 9pm");
ADD_ONE_DAY=$START_DAY_SEVEN_AM_EPOCH_DATE
until [ "$ADD_ONE_DAY" -gt "$END_DAY_SEVEN_AM_EPOCH_DATE" ]
do
let ADD_ONE_DAY=$ADD_ONE_DAY+86400
echo $ADD_ONE_DAY
done$ADD_ONE_DAY是否大于$END_DAY_SEVEN_AM_EPOCH_DATE$ADD_ONE_DAY初始化$START_DAY_SEVEN_AM_EPOCH_DATE$ADD_ONE_DAY内增加一天(而不是$START_DAY_SEVEN_AM_EPOCH_DATE,其结果总是相同的值,即一个无穷无尽的循环)使用seq命令循环一个月的所有日子的另一个解决方案可以是:
#!/bin/bash
START_LAST_MONTH=$(date "+%Y-%m-01" -d "-1 Month")
END_LAST_MONTH=$(date "+%Y-%m-%d" -d "$START_LAST_MONTH +1 month -1 day")
CURRENT_YEAR=$(date +%Y -d "-1 Month")
CURRENT_MONTH=$(date +%m -d "-1 Month")
LAST_DAY_OF_MONTH=$(date +%d -d "$END_LAST_MONTH");
for CURRENT_DAY in $(seq -w 1 "$LAST_DAY_OF_MONTH"); do
CURRENT_DATE="$CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DAY"
CURRENT_DAY_SEVEN_AM_EPOCH=$(date +%s -d"$CURRENT_DATE 7am")
CURRENT_DAY_NINE_PM_EPOCH=$(date +%s -d"$CURRENT_DATE 9pm")
echo "$CURRENT_DAY_SEVEN_AM_EPOCH - $CURRENT_DAY_NINE_PM_EPOCH"
done在这里,seq -w 1 "$LAST_DAY_OF_MONTH"将生成一个从1到相应月份的最后一天的序列,如果需要的话,-w输出以0为单位的等宽填充的数字,即"01“、"02”、.
https://stackoverflow.com/questions/57513287
复制相似问题