在csh中获取上个月的最后一天?

时间:2010-03-24 21:15:13

标签: shell date escaping csh

如何在csh中获得上个月的最后一天?

到目前为止,这是代码。如果你从(FreeBSD sh)命令行执行它,下面的cal命令几乎可以工作,但是我无法正确地转义它以在脚本中运行。通过几乎工作,我的意思是它返回31,当2010年2月的最后一天是28。

#!/bin/csh
set lastdayoflastmonth=`cal `date '+%m'` `date '+%Y'` | grep . | fmt -1 | tail -1`
echo $lastdayoflastmonth

要明确:

  • 如果今天是2010年3月26日,它应该返回28号,这是2010年2月的最后一天。

  • 如果今天是2010年7月1日,它应该返回30号,这是2010年6月的最后一天。

更新:Joshua Smith在下面的评论中收到的工作答案:date -v31d -v-1m '+%d'谢谢!

3 个答案:

答案 0 :(得分:1)

只需使用日期命令:

date -v31d +'%a'

将为您提供当月最后一天的日期名称

下个月:

date -v31d -v+1m +'%a'

如果您想要上个月:

date -v31d -v-1m +'%a'

- 编辑:评论者对GNU Date ---

有疑问

如果您使用的是gnu日期(以上使用BSD日期),您可以使用-d标志。但它有点复杂(gnu date与月长度模糊不同)。获得上个月的最后一天

当月:

date -d "$(date -d "next month" +%Y-%m-1) -1 day" +%a

以及下个月

date -d "$(date -d "2 months" +%Y-%m-1) -1 day" +%a

上个月:

date -d "$(date +%Y-%m-1) -1 day" +%a

答案 1 :(得分:0)

我认为(如果我没记错的话),当'嵌套'时,你必须加倍反引号(``)。

尝试(未经测试):

set lastdayoflastmonth=`cal ``date '+%m'`` ``date '+%Y'`` | grep . | fmt -1 | tail -1`
echo $lastdayoflastmonth

答案 2 :(得分:0)

您可以缩短命令以省略grep/fmt。此外,没有必要将它们塞进一行。

set month=`date '+%m'`
set year=`date '+%Y'`
set lastdaymonth=`cal $month $year  |tr -s " " "\n"|tail -1`

例如

$ tcsh
$ set month="02"
$ set year="2010"
$ set lastdaymonth=`cal $month $year  |tr -s " " "\n"|tail -1`
$ echo $lastdaymonth
28
$ tcsh --version
tcsh 6.17.00 (Astron) 2009-07-10 (i386-intel-linux) options wide,nls,dl,al,kan,rh,color,filec