17

私たちが知っているように、毎年次のように毎月の最大日は次のとおりです。

Jan - 31 days
Feb - 28 days / 29 days (leap year)
Mar - 31 days
Apr - 30 days
May - 31 days
Jun - 30 days
Jul - 31 days
Aug - 31 days
Sep - 30 days
Oct - 31 days
Nov - 30 days
Dec - 31 days

if elseorswitchまたはwhileループを使用せずにbashで現在の年の値(各月の最終日)を返すにはどうすればよいですか?

4

11 に答える 11

48

私の見解:

for m in {1..12}; do
  date -d "$m/1 + 1 month - 1 day" "+%b - %d days"; 
done

説明: m=1 の場合の最初の反復では、-d引数は「1/1 + 1 月 - 1 日」であり、「1/1」は 1 月 1 日と解釈されます。したがって、1 月 1 日 + 1 か月 - 1 日は 1 月 31 日です。次の反復 "2/1" は 2 月 1 日です。月を足して 1 日を引くと、2 月 28 日または 29 日になります。以下同様です。

于 2012-09-12T10:42:38.477 に答える
16
cat <<EOF
Jan - 31 days
Feb - `date -d "yesterday 3/1" +"%d"` days
Mar - 31 days
Apr - 30 days
May - 31 days
Jun - 30 days
Jul - 31 days
Aug - 31 days
Sep - 30 days
Oct - 31 days
Nov - 30 days
Dec - 31 days
EOF
于 2012-09-12T05:27:33.073 に答える
7

「for」を許可すると仮定すると、bashで次のようになります

for m in {1..12}; do
    echo $(date -d $m/1/1 +%b) - $(date -d "$(($m%12+1))/1 - 1 days" +%d) days
done

これを生成します

 Jan - 31 days
 Feb - 29 days
 Mar - 31 days
 Apr - 30 days
 May - 31 days
 Jun - 30 days
 Jul - 31 days
 Aug - 31 days
 Sep - 30 days
 Oct - 31 days
 Nov - 30 days
 Dec - 31 days

注:私はcal

雑学クイズを楽しむ人のために:

Number months from 1 to 12 and look at the binary representation in four
bits {b3,b2,b1,b0}.  A month has 31 days if and only if b3 differs from b0.
All other months have 30 days except for February.

したがって、2月を除いて、これは機能します。

for m in {1..12}; do
    echo $(date -d $m/1/1 +%b) - $((30+($m>>3^$m&1))) days
done

結果:

Jan - 31 days
Feb - 30 days (wrong)
Mar - 31 days
Apr - 30 days
May - 31 days
Jun - 30 days
Jul - 31 days
Aug - 31 days
Sep - 30 days
Oct - 31 days
Nov - 30 days
Dec - 31 days
于 2012-09-12T05:20:36.213 に答える
7
cal $(date +"%m %Y") |
awk 'NF {DAYS = $NF}; END {print DAYS}'

これは、標準calユーティリティを使用して指定された月を表示し、単純な Awk スクリプトを実行して最終日の数字だけを引き出します。

于 2016-04-08T21:45:14.480 に答える
1

の内容script.sh:

#!/bin/bash
begin="-$(date +'%-m') + 2"
end="10+$begin"

for ((i=$begin; i<=$end; i++)); do
    echo $(date -d "$i month -$(date +%d) days" | awk '{ printf "%s - %s days", $2, $3 }')
done

結果:

Jan - 31 days
Feb - 29 days
Mar - 31 days
Apr - 30 days
May - 31 days
Jun - 30 days
Jul - 31 days
Aug - 31 days
Sep - 30 days
Oct - 31 days
Nov - 30 days
于 2012-09-12T06:08:52.320 に答える