#!/bin/bash

echo "何年・何月のカレンダーを表示しますか?"
echo "西暦何年?(数字のみ入力)"
read year
echo "何月?(数字のみ入力)"
read month
#↑年、月を聞く

if [ $year -lt 1 -o $year -gt 9999 ]
#西暦0年以前、10000年以降と言われると

then echo "計算できません"
#エラーメッセージ

exit
#終了

elif [ $month -lt 1 -o $month -gt 12 ]
#0月以前、13月以降と言われると

then echo "計算できません"
#エラーメッセージ

   exit
#終了

fi

if [ $month = 1 -o $month = 2 ];then
#もし1月か2月のときは

Y=`expr $year -1`
#年、月を前年の13月、14月と考える

M=`expr $month + 12`
else
#それ以外の月なら

Y=$year
#そのまま

M=$month
fi

#以下ツェラーの公式の計算
#1日の曜日を求める

J=`expr $Y / 100`
K=`expr $Y % 100`
j=`expr $J / 4`
k=`expr $K / 4`
m=`expr \( $M + 1 \) \* 26 / 10`
j2=`expr $J \* 2`
H=`expr 1 + $m + $K + $k + $j - $j2`
L=`expr $H % 7`

if [ $L -lt 0 ]
#余りが負のとき

then
h=`expr $L + 7`
#+7で正にする

else
#もともと正なら

h=$L
#そのまま

fi

#閏年かどうか考える

ye=`expr $year / 100`
#ほんとの年の上2桁

ar=`expr $year % 100`
#下2桁

uY=`expr $year % 4`
#ほんとの年を4で割ったあまり

uy=`expr $ye % 4`
#ほんとの年の上2桁を4で割ったあまり

urutest1=`test $uY = 0 -a $ar -ne 0 ; echo $?`
#4で割り切れ、かつ100で割り切れないかテスト

urutest2=`test $ar = 0 -a $uJ = 0 ; echo $?`
#400で割り切れるかテスト


if [ \( $urutest1 = 0 -o $urutest2 = 0 \) -a $M = 14 ];then
#もし閏年かどうかのテストのどちらかが真で、かつ2月を表示するなら

matsu=29
#末日は29日

elif [ $M = 4 -o $M = 6 -o $M = 9 -o $M = 11 ];then
#4,6,9,11月なら

matsu=30
#末日は30日

elif [ $M = 14 ];then
#ふつうの2月なら

matsu=28
#末日は28日

else
#それ以外は

matsu=31
#末日は31日

fi

printf "%16s %12s\n" $year年 $month月
#カレンダーの表示

printf "%4s %4s %4s %4s %4s %4s %4s\n" Sun Mon Tue Wed Thu Fri Sat

#1日の前の空白の数をかぞえる

if [ $h = 0 ];then
#1日が土曜なら

sp=6
#空白6つ

else sp=`expr $h - 1`
#それ以外空白は(h-1)個

fi

#空白をnum[x]の形に整理

kuuhaku=1
#貯金箱"kuuhaku"をつくって1から開始

while :
do
if [ $kuuhaku -gt $sp ];then
#"kuuhaku"の中身の数字が予定した空白より多くなったら

break
#ループから抜ける

fi
num[ $kuuhaku ]=" "
#num["kuuhaku"]には空白を入れる

kuuhaku=`expr $kuuhaku + 1`
#これまでの"kuuhaku"に1足す

done

#日付を同様にして整理する

hinichi=1
#貯金箱"hinichi"をつくって1から開始

while :
do
if [ `expr $hinichi + $sp` -gt 42 ];then
#"hinichi"の中身の数と空白の数を足したものが42以上になったら

break
#ループから抜ける

fi
#(6週間ぶん並べられるようにした)

if [ $hinichi -gt $matsu ];then
#"hinichi"が設定した末日より大きくなると

num[ `expr $hinichi + $sp` ]=" "
#それ以降は空白を表示

else
#最初のほう"hinichi"が末日より前のとき

num[ `expr $hinichi + $sp` ]=$hinichi
#num[空白の数+hinichi]には"hinichi"を入れる

hinichi=`expr $hinichi + 1`
#"hinichi"に1足して次のループ

done
#ここでnum[x]のxは空白の数の分ずらしている


#ならべる

printf "%4s %4s %4s %4s %4s %4s %4s\n" "${num[1]}" "${num[2]}" "${num[3]}" "${num[4]}" "${num[5]}" "${num[6]}" "${num[7]}"
printf "%4d %4d %4d %4d %4d %4d %4d\n" "${num[8]}" "${num[9]}" "${num[10]}" "${num[11]}" "${num[12]}" "${num[13]}" "${num[14]}"
printf "%4d %4d %4d %4d %4d %4d %4d\n" "${num[15]}" "${num[16]}" "${num[17]}" "${num[18]}" "${num[19]}" "${num[20]}" "${num[21]}"
printf "%4d %4d %4d %4d %4d %4d %4d\n" "${num[22]}" "${num[23]}" "${num[24]}" "${num[25]}" "${num[26]}" "${num[27]}" "${num[28]}"
printf "%4s %4s %4s %4s %4s %4s %4s\n" "${num[29]}" "${num[30]}" "${num[31]}" "${num[32]}" "${num[33]}" "${num[34]}" "${num[35]}"
printf "%4s %4s %4s %4s %4s %4s %4s\n" "${num[36]}" "${num[37]}" "${num[38]} " "${num[39]}" "${num[40]}" "${num[41]}" "${num[42]}"
#終了

前ページへ