【问题标题】:Iterate through 2 dates using bash script on mac在 mac 上使用 bash 脚本遍历 2 个日期
【发布时间】:2022-01-24 14:40:50
【问题描述】:

我正在尝试创建一个循环来遍历 2 个日期。 到目前为止,我有这个,但是它正在回到过去。我希望它以 start_date 开始,以 end_date 结束。 我试图交换它们,但它不喜欢那样并无限增加+1day。任何帮助将不胜感激。

#!/usr/bin/env bash
end_date="21-12-21"
start_date="21-11-20"
# Set a counter variable
counter=0

#Increase the counter to get back in time
while [ "$end_date" != "$start_date" ]; do
  end_date=$(date -v -${counter}d '+%y-%m-%d')
  echo $end_date
  counter=$((counter + 1))
done

这就是它产生的结果

21-12-23
21-12-22
21-12-21
21-12-20
21-12-19
21-12-18
21-12-17
21-12-16
21-12-15
21-12-14
21-12-13
21-12-12
21-12-11
21-12-10
21-12-09
21-12-08
21-12-07
21-12-06
21-12-05
21-12-04
21-12-03
21-12-02
21-12-01
21-11-30
21-11-29
21-11-28
21-11-27
21-11-26
21-11-25
21-11-24
21-11-23
21-11-22
21-11-21
21-11-20

我也在 Mac 上运行它,它似乎对日期格式非常挑剔。到目前为止,这是我发现它工作的唯一方法。

【问题讨论】:

  • 这对您有帮助吗? stackoverflow.com/a/37225205/3387716
  • 顺便说一句,文件的前两个字节必须是 #! 才能使 shebang 有效。
  • 哦,谢谢,复制代码时一定错过了
  • @newbiecoder - 很高兴你成功了 - 祝你的脚本好运。 (Linux 会宠坏你:)

标签: bash macos sh


【解决方案1】:

在 macOS 上,您可以使用现成的 ruby​​:

ruby -e '
  t0,t1 = ARGV.map{|arg| Time.new(*arg.split("-")).to_i};
  t0.step(t1,(t0 < t1 ? 1 : -1)*86400) {|t| puts Time.at(t).strftime "%y-%m-%d"};
' 21-12-29 22-01-01

输出:

21-12-29
21-12-30
21-12-31
22-01-01

注意:脚本可以根据参数的顺序反向生成日期。

使用单一语言的主要优点是它可以防止在每次迭代中产生date 命令;生成远距离时,它会明显更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2020-05-16
    • 2020-01-16
    • 1970-01-01
    • 2017-07-01
    相关资源
    最近更新 更多