使用 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
它有效,但我陷入无限循环,无法完全弄清楚发生了什么。
让我们看看
$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
好多了。
如果启用调试模式 (
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