cur_date=`date +"%m/%d/%Y"` (Output 04/01/2016)
cur_day=`date +"%a"` (Output Fri)
我想从上面的命令创建一个新问题但我也想要
cur_day =cur_date + "X">
我需要有人帮助我处理"X"。
我会将当前日期转换为自 Unix 纪元以来的秒数,将需要偏移的天数加上 86,400¹,然后将其转换回人类可读的日期。
Solaris 11(又名SunOS 5.11(date(1)
程序可以通过date '+%s'
完成第一部分,POSIX shell²可以做算术(例如 echo $(($(date '+%s') + 3 * 86400))
(,但 Solaris 版本的 date
无法将该日期(以秒为单位(值转换回人工格式的日期。
如果您的系统安装了 GNU date
作为gdate
(如 Solaris 11 所做的那样(,您可以缩小最后一个差距:
$ gdate -d @$(($(gdate '+%s') + 3 * 86400)) '+%m/%d/%Y'
这给出了"3 天之后"的人工格式版本。
不幸的是,Solaris 10(又名SunOS 5.10(没有预装GNU工具。如果您不愿意安装它们,则需要不同的解决方案。
在 Solaris 10 及更高版本上起作用的一种方法是使用 Perl,它可以在单行中执行相同的操作:
$ perl -MPOSIX -e 'print strftime("%m/%d/%Y", localtime(time + 3 * 86400)), "n"'
这可能早在 Solaris 9 中就有效。
如果你需要比这更复杂的日期操作,我建议使用 Perl Date::Manip
模块。它非常强大。这是用大锤猎杀蝴蝶,但以下是你在 Perl 单行中使用Date::Manip
做上述事情的方法:
$ perl -MDate::Manip -e 'print UnixDate(DateCalc("now", "3d"), "%m/%d/%Yn")'
脚注
86,400 是正常一天中的秒数。您可能会认为上述使用该常数的解决方案在面对闰秒时无法正常工作,但是因为您要求以天为单位的准确性,所以这可能无关紧要。
仅当脚本在闰秒调整的精确秒段运行时,这才有意义,闰秒调整通常发生在午夜 UTC+0。在北美,这通常是在下班后。一些网站将闰秒调整移动到更方便的时间,例如当地凌晨 2 点。如果您的脚本没有在那个确切的时刻运行,则闰秒不会影响它。
这些调整每隔几年才发生一次,并且调整时间提前几个月公布,因此如果您的脚本绝对必须在那个时候运行并且其答案必须包括闰秒调整,您可以计划它。
所有版本的 Solaris 都包含一个 POSIX shell,因为 POSIX 早于 Solaris 1.0。
至少在 Solaris 11 中是这样,因为它非常接近 POSIX
date(1)
规范。我这里没有 Solaris 9 盒子可以测试,所以我依靠明智的猜测:首先,Solaris 9 与 Perl 一起提供,就像 Solaris 10 和 11 一样,其次,它是 Perl 5,所以它将接受解决方案中的
-MPOSIX
标志。Perl 4 不支持模块,所以它没有-M
标志。我相信我可以写一个不同的解决方案来与 Perl 4 一起使用,但是由于您不需要它来工作那么久远,而且我已经 2 年没有编写任何 Perl 4 了......
怎么样:
timestamp="$(date +'%m/%d/%Y') $(date +'%a')"
这将等效于:
timestamp="04/01/2016 Fri"