#!/bin/bash
# slightly malformed input data
input_start=2014-11-1
input_end=2016-01-1
# 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
m="$startdate"
while [ "$m" != "$enddate" ]; do
echo $m
m=$(date -I -d "$m + 1 month")
done
“脚本运行正常,但是当我想要改变While循环条件,即'< =''小于或等于'给出错误,即使我尝试使用”-le“。我想在这里做的是在while循环中,startdate< = enddate。任何人都可以建议需要做些什么来克服这个问题。
答案 0 :(得分:2)
-le
用于数字数据。 2014-11-01
不是数字。使用<
或>
。 (您需要将其转义为\<
或\>
。或使用[[
代替[
。)
有效,改变
while [ "$m" != "$enddate" ]; do
到
until [ "$m" \> "$enddate" ]; do
或
until [ "$m" '>' "$enddate" ]; do
或
until [[ "$m" > "$enddate" ]]; do
或者,使用seconds since epoch
代替ISO8601
格式。
while [ "$(date -d "$m" +%s)" -le "$(date -d "$enddate" +%s)" ]; do
答案 1 :(得分:2)
使用dateutils' datetest
这很简单:
$ datetest 2014-11-1 --le 2016-01-1 ; echo $?
0
$ datetest 2014-11-1 --gt 2016-01-1 ; echo $?
1
然后,你想要的只是由dateseq
完成,它恰好也是dateutils套件的工具。
$ dateseq 2014-11-1 +1mo 2016-01-1
2014-11-01
2014-12-01
2015-01-01
2015-02-01
2015-03-01
2015-04-01
2015-05-01
2015-06-01
2015-07-01
2015-08-01
2015-09-01
2015-10-01
2015-11-01
2015-12-01
2016-01-01
免责声明:我是该套餐的作者。