Bash:开始日期小于等于结束日期

时间:2017-04-28 04:59:44

标签: bash shell date while-loop compare

#!/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。任何人都可以建议需要做些什么来克服这个问题。

Same Code

2 个答案:

答案 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

免责声明:我是该套餐的作者。