#!/bin/bash echo "Enter year & month. ex) 2112 9" #目的の年月の入力を促す read yr mn #yrとmnに年月を読み込む if [ $yr -lt 1 -o $yr -gt 9999 ] #入力された年が1〜9999の範囲にないと then echo "illigal year value: use 1-9999" #文句を言って exit #終了 elif [ $mn -lt 1 -o $mn -gt 12 ] #入力された月が1〜12の範囲にないと then echo "illigal month value: use 1-12" #文句を言って exit #終了 fi #↓ツェラーの公式の準備↓ if [ $mn -lt 3 ] #求める月が1月、2月の場合 then yy=`expr $yr - 1` #前年の mm=`expr $mn + 12` #13月、14月とする else #それ以外のときは yy=$yr #そのまま mm=$mn #そのまま fi J=`expr $yy / 100` #年の上二桁を取り出す K=`expr $yy % 100` #年の下二桁を取り出す q=1 #一日の曜日を求めるため、求める日は1にする #↓ツェラーの公式の計算↓ z1=`expr \( $mm + 1 \) \* 26 / 10` z2=`expr $K / 4` z3=`expr $J / 4` h=`expr \( $q + $z1 + $K + $z2 + $z3 - 2 \* $J \) % 7` #求める年月の一日の曜日が出る if [ $h -lt 0 ] #hが負の時 then h=`expr $h + 7` #正にする fi sp=`expr $h - 1` #1日の前に入れる空白の数を求める #ただし、土曜日は-1になってしまうので if [ $h -eq 0 ] #spが0(土曜日)の時 then sp=6 #空白の数を6にする fi #↓まず配列"cal"に曜日の部分を作る if [ "$1" = "e" ] #引数にeがあるとき then cal=("Su" "Mo" "Tu" "We" "Th" "Fr" "Sa") #配列"cal"に英語の曜日の部分を作る else #引数にeがないとき cal=("日" "月" "火" "水" "木" "金" "土") #配列"cal"に日本語の曜日の部分を作る fi #↓次に、日付が始まる前の空白の部分を作る nn=1 #空白の個数+1 while : #以下を繰り返し do if [ $nn -gt $sp ] #空白の個数+1が空白の個数より多ければ then break #空白を並べるのをやめる fi cn=`expr $nn + 6` #空白を作る場所の番地を作る cal[$cn]=" " #配列"cal"のその番地に空白を取り付ける nn=`expr $nn + 1` #次の空白のために値をひとつ増やす done #以上を繰り返し #↓最後に、日付を並べる #↓閏年の有無を決める準備 yu=`expr $yr % 4` #閏年のとき0になる yx=`expr $yr % 100` #100で割り切れるとき0になる yz=`expr $yr % 400` #400で割り切れるとき0になる #↓求める月の日付の長さを決める if [ $mn -eq 4 -o $mn -eq 6 -o $mn -eq 9 -o $mn -eq 11 ] #西向く士の月(2月除く)のときは then ih=30 #30日まで else #1、3、5、7、8、10、12月のときは ih=31 #31日まで fi if [ $yu -eq 0 -a $mn -eq 2 ] #閏年の2月のときは then ih=29 #29日まで fi if [ $yz -ne 0 -a $yx -eq 0 -a $mn -eq 2 ] #100年に一遍の閏年じゃない2月のとき(ただし400年に一遍のときは除く)は then ih=28 #28日まで fi nn=1 #日付の値 while : #以下を繰り返し do if [ $nn -gt $ih ] #日付の個数+1が日付の長さより多ければ then break #日付を並べるのをやめる fi cn=`expr $nn + 6 + $sp` #日付を作る場所の番地を作る cal[$cn]=$nn #配列"cal"のその番地に日付を取り付ける nn=`expr $nn + 1` #次の日付の値を作る done #以上を繰り返し if [ "$1" = "e" ] #引数にeがあるとき then eng=(" " " January" " February" " March" " April" #英語月名の部分を作る " May" " June" " July" " August" "September" " October" " November" " December") #↓モニタに表示 echo " ${eng[$mn]} $yr" #年月を表示 printf "%2s %2s %2s %2s %2s %2s %2s\n" "${cal[@]}" #カレンダー本体を表示 #↓quiz2.txtに出力 echo " ${eng[$mn]} $yr" > quiz2.txt #年月を出力 #↓カレンダー本体を出力 printf "%2s %2s %2s %2s %2s %2s %2s\n" "${cal[@]}" >> quiz2.txt else #引数にeがないとき kyu=(" " "睦月" "如月" "弥生" "卯月" "皐月" "水無月" #旧暦月名の部分を作る "文月" "葉月" "長月" "神無月" "霜月" "師走") #↓モニタに表示 echo " $yr年$mn月(${kyu[$mn]})" #年月を表示 printf "%2s %2s %2s %2s %2s %2s %2s\n" "${cal[@]}" #カレンダー本体を表示 #↓quiz2.txtに出力 echo " $yr年$mn月(${kyu[$mn]})" > quiz2.txt #年月を出力 #↓カレンダー本体を出力 printf "%2s %2s %2s %2s %2s %2s %2s\n" "${cal[@]}" >> quiz2.txt fi exit #おしまい