在 bash 中以 %Y-%m-%d-%H 格式生成两个日期之间的所有日期

问题描述 投票:0回答:2

使用 bash 我想生成

2023-11-04-00
2023-11-06-00
之间的所有日期,其中格式为
%Y-%m-%d-%H
。我已经尝试过了:

#!/bin/bash

d=2023-11-04
while [ "$d" != 2023-11-06 ]; do
        d=$(date -d "$d 1 hour")
        u=$(date -d "$d" +'%Y-%m-%d-%H')
        echo $u
done

它有效,但我陷入无限循环,无法完全弄清楚发生了什么。

linux bash date gnu
2个回答
0
投票

让我们看看

$d
实际上是什么样子:

$ d=2023-11-04
$ d=$(date -d "$d 1 hour")
$ echo "$d"
Sat Nov  4 01:00:00 AM EDT 2023

哦。这不是一个永远等于

2023-11-06
的字符串。

让我们看看是否可以解决这个问题:

#!/bin/bash

d=2023-11-04
while [ "$(date -d "$d" +'%Y-%m-%d')" '<' 2023-11-06 ]; do
        d=$(date -d "$d 1 hour")
        u=$(date -d "$d" +'%Y-%m-%d-%H')
        echo $u
done

好多了。


0
投票

如果启用调试模式 (

set -xv
),您会注意到第一对通过循环:

+++ '[' 2023-11-04 '!=' 2023-11-06 ']'
        ^^^^^^^^^^
++++ date -d '2023-11-04 1 hour'
+++ d='Sat Nov  4 01:00:00 CDT 2023'
++++ date -d 'Sat Nov  4 01:00:00 CDT 2023' +%Y-%m-%d-%H
+++ u=2023-11-04-01
+++ echo 2023-11-04-01
2023-11-04-01

+++ sleep 0.3
+++ '[' 'Sat Nov  4 01:00:00 CDT 2023' '!=' 2023-11-06 ']'
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
++++ date -d 'Sat Nov  4 01:00:00 CDT 2023 1 hour'
+++ d='Sat Nov  4 02:00:00 CDT 2023'
++++ date -d 'Sat Nov  4 02:00:00 CDT 2023' +%Y-%m-%d-%H
+++ u=2023-11-04-02
+++ echo 2023-11-04-02
2023-11-04-02

注意两个测试中

d
变量格式的变化:

  • 第一次测试:
    2023-11-04
  • 第二次测试:
    Sat Nov  4 01:00:00 CTD 2023
    (您的时间和/或 tz 可能会有所不同)

您需要(重新)格式化

date
调用的输出,例如:

d=$(date -d "$d 1 hour" +'%Y-%m-%d')   # effectively copy what you did for the 'u' variable
© www.soinside.com 2019 - 2024. All rights reserved.