Bash 循环一系列日期。d=$(日期-I-d“d&”x2B“1天”)不工作

Bash 循环一系列日期。d=$(日期-I-d“d&”x2B“1天”)不工作,bash,Bash,我试着循环一个日期范围,并在帖子上复制了答案 我的脚本“loop\u run\u local.sh”: d=2019-11-12 while [ "$d" != 2019-11-14 ]; do echo 'Starting Data Extract...' echo 'run date is: ' $d echo 'Starting Transactions Extract...' python3.7 flagship_ecom/run_transactions.py $d

我试着循环一个日期范围,并在帖子上复制了答案

我的脚本“loop\u run\u local.sh”:

d=2019-11-12
while [ "$d" != 2019-11-14 ]; do
  echo 'Starting Data Extract...'
  echo 'run date is: ' $d
  echo 'Starting Transactions Extract...'
  python3.7 flagship_ecom/run_transactions.py $d    
  d=$(date -I -d "$d + 1 day")
done
这似乎只适用于第一次迭代,而不适用于随后的日期,所以我猜有些东西不适用于
d=$(date-I-d“$d+1天”)

点击ctrl+z停止循环前的终端输出:

bash-3.2$ ./flagship_ecom/loop_run_local.sh
Starting Data Extract...
run date is:  2019-11-12
Starting Transactions Extract...
pageToken is:0 : 2019-11-12
/Users/macuser/Library/Python/3.7/lib/python/site-packages/tqdm/std.py:658: FutureWarning: The Panel class is removed from pandas. Accessing it from the top-level namespace will also be removed in the next version
  from pandas import Panel
Pandas Apply: 100%|██████████████████████████████████████████████████████████████████████████████| 2737/2737 [00:00<00:00, 3156.76it/s]
date: illegal option -- I
usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Starting Data Extract...
run date is:
Starting Transactions Extract...
Traceback (most recent call last):
  File "flagship_ecom/run_transactions.py", line 17, in <module>
    start_date = sys.argv[1]
IndexError: list index out of range
date: illegal option -- I
usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Starting Data Extract...
run date is:
Starting Transactions Extract...
Traceback (most recent call last):
  File "flagship_ecom/run_transactions.py", line 17, in <module>
    start_date = sys.argv[1]
IndexError: list index out of range
date: illegal option -- I
usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Starting Data Extract...
run date is:
Starting Transactions Extract...
^Z
[2]+  Stopped                 ./flagship_ecom/loop_run_local.sh
因为在开始日期之后的日期上这是空白的,我想我的日期递增是有问题的吧

以下是每个注释前加上bash-x的输出:

bash-3.2$ bash -x ./flagship_ecom/loop_run_local.sh
+ d=2019-11-12
+ '[' 2019-11-12 '!=' 2019-11-14 ']'
+ echo 'Starting Data Extract...'
Starting Data Extract...
+ echo 'run date is: ' 2019-11-12
run date is:  2019-11-12
+ echo 'Starting Transactions Extract...'
Starting Transactions Extract...
+ python3.7 flagship_ecom/run_transactions.py 2019-11-12
pageToken is:0 : 2019-11-12
/Users/macuser/Library/Python/3.7/lib/python/site-packages/tqdm/std.py:658: FutureWarning: The Panel class is removed from pandas. Accessing it from the top-level namespace will also be removed in the next version
  from pandas import Panel
Pandas Apply: 100%|██████████████████████████████████████████████████████████████████████████████| 2737/2737 [00:00<00:00, 2971.93it/s]
++ date -I -d '2019-11-12 + 1 day'
date: illegal option -- I
usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
+ d=
+ '[' '' '!=' 2019-11-14 ']'
+ echo 'Starting Data Extract...'
Starting Data Extract...
+ echo 'run date is: '
run date is:
+ echo 'Starting Transactions Extract...'
Starting Transactions Extract...
+ python3.7 flagship_ecom/run_transactions.py
Traceback (most recent call last):
  File "flagship_ecom/run_transactions.py", line 17, in <module>
    start_date = sys.argv[1]
IndexError: list index out of range
^Z
[8]+  Stopped                 bash -x ./flagship_ecom/loop_run_local.sh
bash-3.2$
bash-3.2$bash-x./flagship\u ecom/loop\u run\u local.sh
+d=2019-11-12
+ '[' 2019-11-12 '!=' 2019-11-14 ']'
+echo“正在启动数据提取…”
正在启动数据提取。。。
+echo的运行日期为:2019-11-12
运行日期:2019-11-12
+回显“正在启动事务提取…”
正在启动事务提取。。。
+python3.7旗舰版_ecom/run_transactions.py 2019-11-12
pageToken是:0:2019-11-12
/Users/macuser/Library/Python/3.7/lib/Python/site packages/tqdm/std.py:658:FutureWarning:Panel类已从pandas中删除。在下一个版本中,从顶级命名空间访问它也将被删除
从熊猫进口小组

申请:100%|██████████████████████████████████████████████████████████████████████████████| 2737/2737[00:00我碰巧也在使用Mac。这里有一个替代脚本,它以秒为单位递增,并发出正常的日历表示形式:

#!/bin/bash

dsecs=`date '+%s'`
ddate=`date -r $dsecs '+%F'`
while [ "$ddate" != 2019-12-31 ]; do
  echo 'run date is: ' $ddate
  dsecs=$((dsecs + 86400))
  ddate=`date -r $dsecs '+%F'`
done
输出:

run date is:  2019-12-24
run date is:  2019-12-25
run date is:  2019-12-26
run date is:  2019-12-27
run date is:  2019-12-28
run date is:  2019-12-29
run date is:  2019-12-30
您可以使用
$ddate
作为要从此脚本调用的程序的输入

上面的脚本在今天的日期开始迭代;如果您需要在其他日期开始迭代,只需将第一行
dsecs=
替换为Unix历元值,例如,迭代开始日期的中午


关于闰秒的问题

欢迎提供建设性的反馈,但在对该答案的评论中提出的问题以及关于该脚本由于忽略闰秒问题而“有问题”的问题中提出的问题是错误的。原因如下:

  • date
    不考虑闰秒,因为Unix时间不考虑闰秒[1];将86400秒添加到Unix历元时间将始终导致
    date
    产生相同的时间,提前一天,即恰好晚一天
  • POSIX时间也与闰秒无关;c.f.,参见
  • 即使闰秒在这里起作用,使用86400秒将时钟提前一整天也只能在午夜开始的日期增加闰秒时失败;否则,86400秒之后就是“第二天”
  • 是的,由于闰秒的原因,反复增加86400秒确实会产生漂移(但同样,不是针对
    date
    )——但到目前为止,闰秒只有27秒,平均间隔20个月[2];因此:

    4.1.通常需要几年的时间,甚至可能受此影响

    4.2.午夜后半分钟或更长的开始时间将完全消除这种漂移的影响

    4.3.自2016年12月31日以来,没有任何闰秒,因此这与当时和现在之间的日期无关

  • 未来的日期(现在)根本没有闰秒——它们与闰年的预测方式不同——因此计算未来的日期就更不用担心了

  • 因此,
    date
    本身的操作使得反复添加86400秒是有效的,即使不是这样,闰秒的重要性也很小。正如我在一篇评论中所指出的,所有真实世界的工程都是在手头的应用程序的上下文中完成的。在广泛、广泛的情况下ap秒数不足以产生效果——或者根本不存在——一个不考虑秒数的解决方案不是有缺陷的……也不是过度设计的

    [1]


    [2]运行
    bash-x yourscript
    来记录它运行的每个命令,因此我们不需要猜测值是什么。另外,
    date
    不是bash的一部分,它是由您的操作系统供应商提供的,所以我们需要知道您运行的操作系统。
    $d
    在第一次迭代后为空,因为
    date
    命令出错,产生错误空白输出;
    非法选项--I
    告诉我,您引用的答案中没有使用相同版本的
    date
    ,这看起来依赖于GNU
    date
    Hi,上面添加了使用-x调用的输出。另外,我在Mac上如果您已经在使用Python,您可以将外部循环移动到Python代码中,w它通常比shell脚本更好地处理日期。请注意,不赞成使用反斜杠替换命令--
    $(…)
    自1991年首次发布以来一直是POSIX sh标准的一部分,并且表现得更好(正确嵌套,不需要反斜杠进行额外转义)。(另外,请参阅“回答好的问题”部分,特别是关于“以前已经被问过多次并回答过多次”的问题的要点)。这忽略了闰秒,因此有时会返回不正确的结果。@CharlesDuffy:感谢您的集体反馈;至于闰秒,所有现实世界的工程都涉及到一定程度的“容忍度”";到目前为止,闰秒平均每20个月插入一次,因此以正午为起点,脚本方法将需要72000年才能生成错误的日期;每个考虑此脚本的人都应该自己决定,他们的情况是否可以容忍未来72000年的准确结果mm?是吗不必
    run date is:  2019-12-24
    run date is:  2019-12-25
    run date is:  2019-12-26
    run date is:  2019-12-27
    run date is:  2019-12-28
    run date is:  2019-12-29
    run date is:  2019-12-30