【问题标题】:Bash: start date less than equal to end dateBash:开始日期小于等于结束日期
【发布时间】:2017-09-26 02:30:26
【问题描述】:
#!/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 循环条件时,即 '

Same Code

【问题讨论】:

  • 如果您的脚本运行良好,那为什么要更改它?

标签: bash shell date while-loop compare


【解决方案1】:

使用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

免责声明:我是包的作者。

【讨论】:

    【解决方案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
    

    【讨论】:

    • 我尝试了你的建议,但仍然无法正常工作错误:第 13 行:[:\
    • 以上修复对我有用。尝试在脚本开头添加set -vx,看看哪些参数被传递给[ 命令。
    • 现在它给了我结果,但只显示开始日期。但是剩下的日期不给..就像2014-11-01 2014-12-01 ...直到2016-01-01 ...我想要这样的结果..
    • 我也想做或需要这样的输出...... Startdate 应该等于 Enddate 这样的输出 2014-11-1 2014-12-1 ...... 2016-01 -1...
    • 我的错。我不知道字符串没有<= 运算符。因此,您可以使用 a<=b 等价于 ! (a >b) 的逻辑。更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    相关资源
    最近更新 更多