如何使用 Bash 遍历日期?
How to loop through dates using Bash?
我有这样的bash脚本:
array=( '2015-01-01', '2015-01-02' )
for i in "${array[@]}"
do
python /home/user/executeJobs.py {i} &> /home/user/${i}.log
done
现在我想遍历一系列日期,例如2015-01-01 至 2015-01-31.
如何在Bash中实现?
更新:
锦上添花:在上一个 运行 完成之前,不应启动任何作业。这样的话,当executeJobs.py完成后bash提示$
就会return.
例如我可以将 wait%1
合并到我的循环中吗?
for i in 2015-01-{01..31} …
更多:
for i in 2015-02-{01..28} 2015-{04,06,09,11}-{01..30} 2015-{01,03,05,07,08,10,12}-{01..31} …
证明:
$ echo 2015-02-{01..28} 2015-{04,06,09,11}-{01..30} 2015-{01,03,05,07,08,10,12}-{01..31} | wc -w
365
Compact/nested:
$ echo 2015-{02-{01..28},{04,06,09,11}-{01..30},{01,03,05,07,08,10,12}-{01..31}} | wc -w
365
已订购,如果重要的话:
$ x=( $(printf '%s\n' 2015-{02-{01..28},{04,06,09,11}-{01..30},{01,03,05,07,08,10,12}-{01..31}} | sort) )
$ echo "${#x[@]}"
365
由于它是无序的,您可以将闰年添加到:
$ echo {2015..2030}-{02-{01..28},{04,06,09,11}-{01..30},{01,03,05,07,08,10,12}-{01..31}} {2016..2028..4}-02-29 | wc -w
5844
使用 GNU 日期:
d=2015-01-01
while [ "$d" != 2015-02-20 ]; do
echo $d
d=$(date -I -d "$d + 1 day")
# mac option for d decl (the +1d is equivalent to + 1 day)
# d=$(date -j -v +1d -f "%Y-%m-%d" "2020-12-12" +%Y-%m-%d)
done
请注意,因为这使用字符串比较,所以它需要边缘日期的完整 ISO 8601 符号(不要删除前导零)。要检查有效的输入数据并在可能的情况下将其强制转换为有效形式,您也可以使用 date
:
# slightly malformed input data
input_start=2015-1-1
input_end=2015-2-23
# After this, startdate and enddate will be valid ISO 8601 dates,
# or the script will have aborted when it encountered unparseable data
# such as input_end=abcd
startdate=$(date -I -d "$input_start") || exit -1
enddate=$(date -I -d "$input_end") || exit -1
d="$startdate"
while [ "$d" != "$enddate" ]; do
echo $d
d=$(date -I -d "$d + 1 day")
done
一个最后的补充:要检查$startdate
是否在$enddate
之前,如果你只期望1000年到9999年之间的日期,你可以简单地使用这样的字符串比较:
while [[ "$d" < "$enddate" ]]; do
为了在 10000 年之后非常安全,当字典序比较失败时,使用
while [ "$(date -d "$d" +%Y%m%d)" -lt "$(date -d "$enddate" +%Y%m%d)" ]; do
表达式$(date -d "$d" +%Y%m%d)
将$d
转换为数字形式,即2015-02-23
变为20150223
,其思想是这种形式的日期可以进行数字比较.
如果想从输入日期循环到下面的任何范围都可以使用,它也会以 yyyyMMdd 格式打印输出...
#!/bin/bash
in=2018-01-15
while [ "$in" != 2018-01-25 ]; do
in=$(date -I -d "$in + 1 day")
x=$(date -d "$in" +%Y%m%d)
echo $x
done
我遇到了同样的问题,我尝试了上面的一些答案,也许它们没问题,但这些答案中的 none 固定在我使用 macOS 尝试做的事情上。
我试图遍历过去的日期,以下是对我有用的方法:
#!/bin/bash
# Get the machine date
newDate=$(date '+%m-%d-%y')
# Set a counter variable
counter=1
# Increase the counter to get back in time
while [ "$newDate" != 06-01-18 ]; do
echo $newDate
newDate=$(date -v -${counter}d '+%m-%d-%y')
counter=$((counter + 1))
done
希望对您有所帮助。
start='2019-01-01'
end='2019-02-01'
start=$(date -d $start +%Y%m%d)
end=$(date -d $end +%Y%m%d)
while [[ $start -le $end ]]
do
echo $(date -d $start +%Y-%m-%d)
start=$(date -d"$start + 1 day" +"%Y%m%d")
done
我需要遍历 AIX、BSD、Linux、OS X 和 Solaris 上的日期。 date
命令是我遇到过的跨平台使用的最不便携和最糟糕的命令之一。我发现编写一个随处可用的 my_date
命令更容易。
下面的 C 程序采用开始日期,并从中增加或减少天数。如果没有提供日期,它会在当前日期基础上增加或减少天数。
my_date
命令允许您在任何地方执行以下操作:
start="2015-01-01"
stop="2015-01-31"
echo "Iterating dates from ${start} to ${stop}."
while [[ "${start}" != "${stop}" ]]
do
python /home/user/executeJobs.py {i} &> "/home/user/${start}.log"
start=$(my_date -s "${start}" -n +1)
done
C 代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
int show_help();
int main(int argc, char* argv[])
{
int eol = 0, help = 0, n_days = 0;
int ret = EXIT_FAILURE;
time_t startDate = time(NULL);
const time_t ONE_DAY = 24 * 60 * 60;
for (int i=0; i<argc; i++)
{
if (strcmp(argv[i], "-l") == 0)
{
eol = 1;
}
else if (strcmp(argv[i], "-n") == 0)
{
if (++i == argc)
{
show_help();
ret = EXIT_FAILURE;
goto finish;
}
n_days = strtoll(argv[i], NULL, 0);
}
else if (strcmp(argv[i], "-s") == 0)
{
if (++i == argc)
{
show_help();
ret = EXIT_FAILURE;
goto finish;
}
struct tm dateTime;
memset (&dateTime, 0x00, sizeof(dateTime));
const char* start = argv[i];
const char* end = strptime (start, "%Y-%m-%d", &dateTime);
/* Ensure all characters are consumed */
if (end - start != 10)
{
show_help();
ret = EXIT_FAILURE;
goto finish;
}
startDate = mktime (&dateTime);
}
}
if (help == 1)
{
show_help();
ret = EXIT_SUCCESS;
goto finish;
}
char buff[32];
const time_t next = startDate + ONE_DAY * n_days;
strftime(buff, sizeof(buff), "%Y-%m-%d", localtime(&next));
/* Paydirt */
if (eol)
fprintf(stdout, "%s\n", buff);
else
fprintf(stdout, "%s", buff);
ret = EXIT_SUCCESS;
finish:
return ret;
}
int show_help()
{
fprintf(stderr, "Usage:\n");
fprintf(stderr, " my_date [-s date] [-n [+|-]days] [-l]\n");
fprintf(stderr, " -s date: optional, starting date in YYYY-MM-DD format\n");
fprintf(stderr, " -n days: optional, number of days to add or subtract\n");
fprintf(stderr, " -l: optional, add new-line to output\n");
fprintf(stderr, "\n");
fprintf(stderr, " If no options are supplied, then today is printed.\n");
fprintf(stderr, "\n");
return 0;
}
Bash 最好利用管道 (|) 来编写。这应该会导致内存高效和并发(更快)处理。我会写以下内容:
seq 0 100 | xargs printf "20 Aug 2020 - %sdays\n" \
| xargs -d '\n' -l date -d
下面将打印20 aug 2020
的日期,并打印它之前100天的日期。
这个单行本可以做成实用工具。
#!/usr/bin/env bash
# date-range template <template>
template="${1:--%sdays}"
export LANG;
xargs printf "$template\n" | xargs -d '\n' -l date -d
默认情况下,我们选择一次迭代过去 1 天。
$ seq 10 | date-range
Mon Mar 2 17:42:43 CET 2020
Sun Mar 1 17:42:43 CET 2020
Sat Feb 29 17:42:43 CET 2020
Fri Feb 28 17:42:43 CET 2020
Thu Feb 27 17:42:43 CET 2020
Wed Feb 26 17:42:43 CET 2020
Tue Feb 25 17:42:43 CET 2020
Mon Feb 24 17:42:43 CET 2020
Sun Feb 23 17:42:43 CET 2020
Sat Feb 22 17:42:43 CET 2020
假设我们要生成到某个日期为止的日期。我们还不知道我们需要多少次迭代才能到达那里。假设汤姆出生于 2001 年 1 月 1 日。我们想要生成每个日期直到某个日期。我们可以通过使用 sed 来实现。
seq 0 $((2**63-1)) | date-range | sed '/.. Jan 2001 /q'
The $((2**63-1))
trick is used to create a big integer.
一旦 sed 退出,它也会退出日期范围实用程序。
也可以使用 3 个月的间隔进行迭代:
$ seq 0 3 12 | date-range '+%smonths'
Tue Mar 3 18:17:17 CET 2020
Wed Jun 3 19:17:17 CEST 2020
Thu Sep 3 19:17:17 CEST 2020
Thu Dec 3 18:17:17 CET 2020
Wed Mar 3 18:17:17 CET 2021
如果您受困于 busybox 日期,我发现使用时间戳是最可靠的方法:
STARTDATE="2019-12-30"
ENDDATE="2020-01-04"
start=$(date -d $STARTDATE +%s)
end=$(date -d $ENDDATE +%s)
d="$start"
while [[ $d -le $end ]]
do
date -d @$d +%Y-%m-%d
d=$(( $d + 86400 ))
done
这将输出:
2019-12-30
2019-12-31
2020-01-01
2020-01-02
2020-01-03
2020-01-04
Unix 时间戳不包括闰秒,因此 1 天始终正好等于 86400 秒。
@Gilli 之前的解决方案非常聪明,因为它利用了这样一个事实,即您可以简单地设置两个日期的格式,使它们看起来像整数。然后您可以使用 -le / less-equal - 通常只适用于数字数据。
问题是,这会将您绑定到日期格式 YMD,例如 20210201。如果您需要不同的东西,例如 2021-02-01(这就是 OP 所暗示的要求),脚本将无法运行:
start='2021-02-01'
end='2021-02-05'
start=$(date -d $start +%Y-%m-%d)
end=$(date -d $end +%-Y%m-%d)
while [[ $start -le $end ]]
do
echo $start
start=$(date -d"$start + 1 day" +"%Y-%m-%d")
done
输出将如下所示:
2021-02-01
2021-02-02
2021-02-03
2021-02-04
2021-02-05
2021-02-06
2021-02-07
./loop.sh: line 16: [[: 2021-02-08: value too great for base (error token is "08")
要解决这个问题并将此循环用于自定义日期格式,您需要使用一个额外的变量,我们称之为“d_start”:
d_start='2021-02-01'
end='2021-02-05'
start=$(date -d $d_start +%Y%m%d)
end=$(date -d $end +%Y%m%d)
while [[ $start -le $end ]]
do
echo $d_start
start=$(date -d"$start + 1 day" +"%Y%m%d")
d_start=$(date -d"$d_start + 1 day" +"%Y-%m-%d")
done
这将导致此输出:
2021-02-01
2021-02-02
2021-02-03
2021-02-04
2021-02-05
这也可能有帮助。基于 的答案,但对整数转换问题的不同解决方案。
基本上,在验证输入时,LoopEachDay
将“结束”日期存储在 秒 中,并首先将当前日期转换为秒(date -d "$dateIteration" '+%s'
), 也是。
#/bin/bash
RegexVerify()
{
regex="";
shift;
if [[ "$@" =~ $regex ]];
then
return 0;
fi
return 1;
}
VerifyDateISO8601()
{
if RegexVerify '^[0-9]{4}-(0?[1-9]|10|11|12)-(0?[1-9]|[12][0-9]|3[01])$' "";
then
return 0;
fi
return 1;
}
# Iterate each day
#
# * The *first* argument is an ISO8601 start date.
# * The *second* argument is an ISO8601 end date or an empty string which assumes
# the current date.
LoopEachDay()
{
if ! VerifyDateISO8601 "";
then
return 1;
fi
if ! VerifyDateISO8601 "" && [ "" != '' ];
then
return 2;
fi
dateIteration="$(date -d "" '+%Y-%m-%d')";
dateIterationEndSeconds="$(date -d "" '+%s')";
while (("$(date -d "$dateIteration" '+%s')" <= dateIterationEndSeconds))
do
printf $'%s\n' "$dateIteration"; # A work with "$dateIteration"
dateIteration="$(date -d "$dateIteration + 1 day" '+%Y-%m-%d')";
done
}
LoopEachDay '2021-13-01' '';
printf $'Exit code: %s\n\n' "$?";
# Exit code: 1
LoopEachDay '2021-04-01' '';
# 2021-04-01
# 2021-04-02
# 2021-04-03
# 2021-04-04
# 2021-04-05
# 2021-04-06
# 2021-04-07
# 2021-04-08
printf $'\n';
LoopEachDay '2021-04-03' '2021-04-06';
# 2021-04-03
# 2021-04-04
# 2021-04-05
# 2021-04-06
我有这样的bash脚本:
array=( '2015-01-01', '2015-01-02' )
for i in "${array[@]}"
do
python /home/user/executeJobs.py {i} &> /home/user/${i}.log
done
现在我想遍历一系列日期,例如2015-01-01 至 2015-01-31.
如何在Bash中实现?
更新:
锦上添花:在上一个 运行 完成之前,不应启动任何作业。这样的话,当executeJobs.py完成后bash提示$
就会return.
例如我可以将 wait%1
合并到我的循环中吗?
for i in 2015-01-{01..31} …
更多:
for i in 2015-02-{01..28} 2015-{04,06,09,11}-{01..30} 2015-{01,03,05,07,08,10,12}-{01..31} …
证明:
$ echo 2015-02-{01..28} 2015-{04,06,09,11}-{01..30} 2015-{01,03,05,07,08,10,12}-{01..31} | wc -w
365
Compact/nested:
$ echo 2015-{02-{01..28},{04,06,09,11}-{01..30},{01,03,05,07,08,10,12}-{01..31}} | wc -w
365
已订购,如果重要的话:
$ x=( $(printf '%s\n' 2015-{02-{01..28},{04,06,09,11}-{01..30},{01,03,05,07,08,10,12}-{01..31}} | sort) )
$ echo "${#x[@]}"
365
由于它是无序的,您可以将闰年添加到:
$ echo {2015..2030}-{02-{01..28},{04,06,09,11}-{01..30},{01,03,05,07,08,10,12}-{01..31}} {2016..2028..4}-02-29 | wc -w
5844
使用 GNU 日期:
d=2015-01-01
while [ "$d" != 2015-02-20 ]; do
echo $d
d=$(date -I -d "$d + 1 day")
# mac option for d decl (the +1d is equivalent to + 1 day)
# d=$(date -j -v +1d -f "%Y-%m-%d" "2020-12-12" +%Y-%m-%d)
done
请注意,因为这使用字符串比较,所以它需要边缘日期的完整 ISO 8601 符号(不要删除前导零)。要检查有效的输入数据并在可能的情况下将其强制转换为有效形式,您也可以使用 date
:
# slightly malformed input data
input_start=2015-1-1
input_end=2015-2-23
# After this, startdate and enddate will be valid ISO 8601 dates,
# or the script will have aborted when it encountered unparseable data
# such as input_end=abcd
startdate=$(date -I -d "$input_start") || exit -1
enddate=$(date -I -d "$input_end") || exit -1
d="$startdate"
while [ "$d" != "$enddate" ]; do
echo $d
d=$(date -I -d "$d + 1 day")
done
一个最后的补充:要检查$startdate
是否在$enddate
之前,如果你只期望1000年到9999年之间的日期,你可以简单地使用这样的字符串比较:
while [[ "$d" < "$enddate" ]]; do
为了在 10000 年之后非常安全,当字典序比较失败时,使用
while [ "$(date -d "$d" +%Y%m%d)" -lt "$(date -d "$enddate" +%Y%m%d)" ]; do
表达式$(date -d "$d" +%Y%m%d)
将$d
转换为数字形式,即2015-02-23
变为20150223
,其思想是这种形式的日期可以进行数字比较.
如果想从输入日期循环到下面的任何范围都可以使用,它也会以 yyyyMMdd 格式打印输出...
#!/bin/bash
in=2018-01-15
while [ "$in" != 2018-01-25 ]; do
in=$(date -I -d "$in + 1 day")
x=$(date -d "$in" +%Y%m%d)
echo $x
done
我遇到了同样的问题,我尝试了上面的一些答案,也许它们没问题,但这些答案中的 none 固定在我使用 macOS 尝试做的事情上。
我试图遍历过去的日期,以下是对我有用的方法:
#!/bin/bash
# Get the machine date
newDate=$(date '+%m-%d-%y')
# Set a counter variable
counter=1
# Increase the counter to get back in time
while [ "$newDate" != 06-01-18 ]; do
echo $newDate
newDate=$(date -v -${counter}d '+%m-%d-%y')
counter=$((counter + 1))
done
希望对您有所帮助。
start='2019-01-01'
end='2019-02-01'
start=$(date -d $start +%Y%m%d)
end=$(date -d $end +%Y%m%d)
while [[ $start -le $end ]]
do
echo $(date -d $start +%Y-%m-%d)
start=$(date -d"$start + 1 day" +"%Y%m%d")
done
我需要遍历 AIX、BSD、Linux、OS X 和 Solaris 上的日期。 date
命令是我遇到过的跨平台使用的最不便携和最糟糕的命令之一。我发现编写一个随处可用的 my_date
命令更容易。
下面的 C 程序采用开始日期,并从中增加或减少天数。如果没有提供日期,它会在当前日期基础上增加或减少天数。
my_date
命令允许您在任何地方执行以下操作:
start="2015-01-01"
stop="2015-01-31"
echo "Iterating dates from ${start} to ${stop}."
while [[ "${start}" != "${stop}" ]]
do
python /home/user/executeJobs.py {i} &> "/home/user/${start}.log"
start=$(my_date -s "${start}" -n +1)
done
C 代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
int show_help();
int main(int argc, char* argv[])
{
int eol = 0, help = 0, n_days = 0;
int ret = EXIT_FAILURE;
time_t startDate = time(NULL);
const time_t ONE_DAY = 24 * 60 * 60;
for (int i=0; i<argc; i++)
{
if (strcmp(argv[i], "-l") == 0)
{
eol = 1;
}
else if (strcmp(argv[i], "-n") == 0)
{
if (++i == argc)
{
show_help();
ret = EXIT_FAILURE;
goto finish;
}
n_days = strtoll(argv[i], NULL, 0);
}
else if (strcmp(argv[i], "-s") == 0)
{
if (++i == argc)
{
show_help();
ret = EXIT_FAILURE;
goto finish;
}
struct tm dateTime;
memset (&dateTime, 0x00, sizeof(dateTime));
const char* start = argv[i];
const char* end = strptime (start, "%Y-%m-%d", &dateTime);
/* Ensure all characters are consumed */
if (end - start != 10)
{
show_help();
ret = EXIT_FAILURE;
goto finish;
}
startDate = mktime (&dateTime);
}
}
if (help == 1)
{
show_help();
ret = EXIT_SUCCESS;
goto finish;
}
char buff[32];
const time_t next = startDate + ONE_DAY * n_days;
strftime(buff, sizeof(buff), "%Y-%m-%d", localtime(&next));
/* Paydirt */
if (eol)
fprintf(stdout, "%s\n", buff);
else
fprintf(stdout, "%s", buff);
ret = EXIT_SUCCESS;
finish:
return ret;
}
int show_help()
{
fprintf(stderr, "Usage:\n");
fprintf(stderr, " my_date [-s date] [-n [+|-]days] [-l]\n");
fprintf(stderr, " -s date: optional, starting date in YYYY-MM-DD format\n");
fprintf(stderr, " -n days: optional, number of days to add or subtract\n");
fprintf(stderr, " -l: optional, add new-line to output\n");
fprintf(stderr, "\n");
fprintf(stderr, " If no options are supplied, then today is printed.\n");
fprintf(stderr, "\n");
return 0;
}
Bash 最好利用管道 (|) 来编写。这应该会导致内存高效和并发(更快)处理。我会写以下内容:
seq 0 100 | xargs printf "20 Aug 2020 - %sdays\n" \
| xargs -d '\n' -l date -d
下面将打印20 aug 2020
的日期,并打印它之前100天的日期。
这个单行本可以做成实用工具。
#!/usr/bin/env bash
# date-range template <template>
template="${1:--%sdays}"
export LANG;
xargs printf "$template\n" | xargs -d '\n' -l date -d
默认情况下,我们选择一次迭代过去 1 天。
$ seq 10 | date-range
Mon Mar 2 17:42:43 CET 2020
Sun Mar 1 17:42:43 CET 2020
Sat Feb 29 17:42:43 CET 2020
Fri Feb 28 17:42:43 CET 2020
Thu Feb 27 17:42:43 CET 2020
Wed Feb 26 17:42:43 CET 2020
Tue Feb 25 17:42:43 CET 2020
Mon Feb 24 17:42:43 CET 2020
Sun Feb 23 17:42:43 CET 2020
Sat Feb 22 17:42:43 CET 2020
假设我们要生成到某个日期为止的日期。我们还不知道我们需要多少次迭代才能到达那里。假设汤姆出生于 2001 年 1 月 1 日。我们想要生成每个日期直到某个日期。我们可以通过使用 sed 来实现。
seq 0 $((2**63-1)) | date-range | sed '/.. Jan 2001 /q'
The
$((2**63-1))
trick is used to create a big integer.
一旦 sed 退出,它也会退出日期范围实用程序。
也可以使用 3 个月的间隔进行迭代:
$ seq 0 3 12 | date-range '+%smonths'
Tue Mar 3 18:17:17 CET 2020
Wed Jun 3 19:17:17 CEST 2020
Thu Sep 3 19:17:17 CEST 2020
Thu Dec 3 18:17:17 CET 2020
Wed Mar 3 18:17:17 CET 2021
如果您受困于 busybox 日期,我发现使用时间戳是最可靠的方法:
STARTDATE="2019-12-30"
ENDDATE="2020-01-04"
start=$(date -d $STARTDATE +%s)
end=$(date -d $ENDDATE +%s)
d="$start"
while [[ $d -le $end ]]
do
date -d @$d +%Y-%m-%d
d=$(( $d + 86400 ))
done
这将输出:
2019-12-30
2019-12-31
2020-01-01
2020-01-02
2020-01-03
2020-01-04
Unix 时间戳不包括闰秒,因此 1 天始终正好等于 86400 秒。
@Gilli 之前的解决方案非常聪明,因为它利用了这样一个事实,即您可以简单地设置两个日期的格式,使它们看起来像整数。然后您可以使用 -le / less-equal - 通常只适用于数字数据。
问题是,这会将您绑定到日期格式 YMD,例如 20210201。如果您需要不同的东西,例如 2021-02-01(这就是 OP 所暗示的要求),脚本将无法运行:
start='2021-02-01'
end='2021-02-05'
start=$(date -d $start +%Y-%m-%d)
end=$(date -d $end +%-Y%m-%d)
while [[ $start -le $end ]]
do
echo $start
start=$(date -d"$start + 1 day" +"%Y-%m-%d")
done
输出将如下所示:
2021-02-01
2021-02-02
2021-02-03
2021-02-04
2021-02-05
2021-02-06
2021-02-07
./loop.sh: line 16: [[: 2021-02-08: value too great for base (error token is "08")
要解决这个问题并将此循环用于自定义日期格式,您需要使用一个额外的变量,我们称之为“d_start”:
d_start='2021-02-01'
end='2021-02-05'
start=$(date -d $d_start +%Y%m%d)
end=$(date -d $end +%Y%m%d)
while [[ $start -le $end ]]
do
echo $d_start
start=$(date -d"$start + 1 day" +"%Y%m%d")
d_start=$(date -d"$d_start + 1 day" +"%Y-%m-%d")
done
这将导致此输出:
2021-02-01
2021-02-02
2021-02-03
2021-02-04
2021-02-05
这也可能有帮助。基于
基本上,在验证输入时,LoopEachDay
将“结束”日期存储在 秒 中,并首先将当前日期转换为秒(date -d "$dateIteration" '+%s'
), 也是。
#/bin/bash
RegexVerify()
{
regex="";
shift;
if [[ "$@" =~ $regex ]];
then
return 0;
fi
return 1;
}
VerifyDateISO8601()
{
if RegexVerify '^[0-9]{4}-(0?[1-9]|10|11|12)-(0?[1-9]|[12][0-9]|3[01])$' "";
then
return 0;
fi
return 1;
}
# Iterate each day
#
# * The *first* argument is an ISO8601 start date.
# * The *second* argument is an ISO8601 end date or an empty string which assumes
# the current date.
LoopEachDay()
{
if ! VerifyDateISO8601 "";
then
return 1;
fi
if ! VerifyDateISO8601 "" && [ "" != '' ];
then
return 2;
fi
dateIteration="$(date -d "" '+%Y-%m-%d')";
dateIterationEndSeconds="$(date -d "" '+%s')";
while (("$(date -d "$dateIteration" '+%s')" <= dateIterationEndSeconds))
do
printf $'%s\n' "$dateIteration"; # A work with "$dateIteration"
dateIteration="$(date -d "$dateIteration + 1 day" '+%Y-%m-%d')";
done
}
LoopEachDay '2021-13-01' '';
printf $'Exit code: %s\n\n' "$?";
# Exit code: 1
LoopEachDay '2021-04-01' '';
# 2021-04-01
# 2021-04-02
# 2021-04-03
# 2021-04-04
# 2021-04-05
# 2021-04-06
# 2021-04-07
# 2021-04-08
printf $'\n';
LoopEachDay '2021-04-03' '2021-04-06';
# 2021-04-03
# 2021-04-04
# 2021-04-05
# 2021-04-06