#!/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]}"
#終了
前ページへ