1

你如何在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' 谢谢!

4

3 回答 3

1

只需使用 date 命令:

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
于 2010-03-24T21:26:39.697 回答
0

我认为(如果我没记错的话)你必须在“嵌套”它们时将反引号(``)加倍。

尝试(未经测试):

set lastdayoflastmonth=`cal ``date '+%m'`` ``date '+%Y'`` | grep . | fmt -1 | tail -1`
echo $lastdayoflastmonth
于 2010-03-24T21:22:45.867 回答
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
于 2010-03-24T23:59:17.907 回答