【问题标题】:Incrementing dates with shell script [duplicate]使用shell脚本递增日期[重复]
【发布时间】:2014-02-12 16:45:28
【问题描述】:

我有以下 bash 脚本来增加分配的日期:DATE。

#!/usr/local/bin/bash

DATE=20130625

for i in {1..10}
do
     NEXT_DATE=$(date +%Y%m%d -d "$DATE + $i day")
     echo $i $NEXT_DATE
done

但是,它只是重复打印今天的日期,如下所示。

1 20140122
2 20140122
3 20140122
4 20140122
5 20140122
6 20140122
7 20140122
8 20140122

感谢任何帮助。顺便说一句,操作系统是 Solaris 11。谢谢。

【问题讨论】:

  • 你检查过你的 Solaris 上的date,如果它是 Gnu 日期吗?是否支持-d'+x day' 表达式?
  • 我在 ubuntu 上并且无法复制此错误,所以是的,这可能是 Solaris 11 上的 date 的问题?此外,不确定它是否是一种类型,但应该清楚有什么事情发生了,因为它甚至没有重复您开始使用的 $DATE,而是今天的日期。
  • 一般不会,应该是这个原因。
  • 其实操作系统是x86 Solaris 10。试过命令“date +%Y%m%d -d”20130625 + 1 day”得到“20140122”。另外,试过:“date - d "last friday" "+%Y%m%d"" 并得到 "date: 非法选项 -- d 用法:date [-u] mmddHHMM[[cc]yy][.SS]。日期 [-u] [+格式] 日期 -a [-]sss[.fff]。任何有关调试或解决方法的帮助都会很棒
  • 是否有可以从 sunfree.com 下载的实用程序进行修复。我看了看,却认不出一个。谢谢

标签: bash shell date solaris


【解决方案1】:

您的date 版本似乎不支持这种日期算法。但是,它应该支持与 Unix 时间戳之间的转换(有关详细信息,请参阅您的文档)。

DATE=$(date +%s "$DATE")   # Adjust as necessary
for i in {1..10}
do
     seconds=$(( $i * 86400 ))
     NEXT_DATE=$(($DATE + $seconds))
     echo $i $(date +%Y%m%d -d @$NEXT_DATE)  # Adjust as necessary
done

【讨论】:

  • 无法访问 Solaris,由于它对date 的实现的假设,这个答案很可能是无用的。
  • 出现错误:“./Date.sh:第 15 行:%s + 86400:语法错误:预期操作数(错误标记为“%s + 86400”)”。我注释了循环行并设置了一个调试来回显 $DATE(在循环之前),它回显“%s”。
  • 检查您的 date 版本的文档,看看是否有办法将给定日期作为自 UNIX 纪元以来的秒数。如果没有,你可以忽略这个答案。
【解决方案2】:

Solaris date 命令(至少在 Solaris 8 中。我找不到 Solaris 11 联机帮助页)不支持您的语法,并且无法在 date 命令中进行计算。

你有两个选择:

  • 忘记使用date 命令和 BASH。相反,请使用可以处理日期的脚本语言,例如 Perl、Python 或 Ruby。
  • Sunfreeware 站点下载GNU Coreutils。 GNU Coreutils 与大多数 Linux 系统上出现的 Date 命令相同。我相信它会将date 命令放入/usr/local/bin,您要么必须将其放入$PATH,要么在命令中包含GNU 日期的整个目录路径。

【讨论】:

  • 是的,我调查了一下,发现安装在 /usr/local/bin/date 下的 GNU Coreutils 中的日期并且运行良好。谢谢大家。
猜你喜欢
  • 2017-06-01
  • 2011-04-15
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 2014-06-27
  • 1970-01-01
相关资源
最近更新 更多