1

先月の最終日をcshで取得するにはどうすればよいですか?

これがこれまでのコードです。以下のcalコマンドは、(FreeBSD sh)コマンドラインから実行するとほとんど機能しますが、スクリプト内で実行するために適切にエスケープするのに問題があります。ほぼ仕事とは、2010年2月の最終日が28のときに31を返すことを意味します。

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

明確にするために:

  • 今日が2010年3月26日の場合、2010年2月の最終日である28という数字を返す必要があります。

  • 今日が2010年7月1日の場合、2010年6月の最終日である30という数字を返す必要があります。

更新:以下のコメントでジョシュア・スミスから受け取った実用的な回答: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

(私の記憶が正しければ) バッククォート (``) を「ネスト」するときは 2 倍にする必要があると思います。

試してください(未テスト):

set lastdayoflastmonth=`cal ``date '+%m'`` ``date '+%Y'`` | grep . | fmt -1 | tail -1`
echo $lastdayoflastmonth
于 2010-03-24T21:22:45.867 に答える
0

コマンドを短縮して を省略できますgrep/fmt。また、それらを 1 行に詰め込む必要はありません。

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 に答える