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

发布于 2024-08-26 14:52:01 字数 553 浏览 8 评论 0原文

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

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

#!/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 年 2 月的最后一天。 2010 年 6 月的一天。

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

How do you get the last day of the last month in csh?

Here is the code so far. The cal command below almost works if you execute it from the (FreeBSD sh) command line, but I'm having trouble escaping it properly to run within a script. By almost work, I mean it returns 31, when the last day of February 2010 is 28.

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

To be clear:

  • If today is March 26th 2010, it should return the number 28, which is the last day of the February 2010.

  • If today is July 1st 2010, it should return the number 30, which is the last day of June 2010.

Update: working answer received from Joshua Smith in comments below: date -v31d -v-1m '+%d' Thank you!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

扭转时空 2024-09-02 14:52:01

只需使用 date 命令:

date -v31d +'%a'

当月最后一天的日期名称

将为您提供下个月

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

:如果您想要上个月:

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

-- 编辑:评论者对 GNU Date 有疑问 ---

如果您使用 gnu date (上面使用 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

Just use the date command:

date -v31d +'%a'

will give you the date name of the last day of the current month

for next month:

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

If you want the previous month:

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

-- EDIT: commenter has question about GNU Date ---

If you are using gnu date (the above uses BSD date) you can use the -d flag. It's a little more complicated, though (gnu date doesn't do the same thing with month length fuzziness). to get the last day of the month for last month

for the current month:

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

and for next month

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

for last month:

date -d "$(date +%Y-%m-1) -1 day" +%a
三五鸿雁 2024-09-02 14:52:01

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

尝试(未经测试):

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

I think (if I recall correctly) that you have to double the backticks (``) when 'nesting' them.

Try (untested):

set lastdayoflastmonth=`cal ``date '+%m'`` ``date '+%Y'`` | grep . | fmt -1 | tail -1`
echo $lastdayoflastmonth
剪不断理还乱 2024-09-02 14:52:01

您可以缩短命令以省略 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

you can shorten your command to omit the grep/fmt. also, there is no need to cram them into one line.

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

eg

$ 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文