#!/bin/bash if [ $# -ne 1 ] then echo 入力する引数は1つとしてください exit fi #引数として何も入力しなかった場合、もしくは2つ以上の引数を入力した場合には、エラーメッセージを出力して終了します if [ $1 -lt 2016 ] then echo 2016年以降の年を指定してください exit fi #入力された引数が1つの場合も、2016年以前の年を引数を入力した場合エラーメッセージを出力して終了します b=0 c=2016 d=2016 e=2016 f=2016 g=2016 h=2016 i=2016 j=2016 k=2016 l=2016 m=2016 n=2016 o=3 #上のように変数を定義します while test $c -ne $1 do if test `expr \( $(( $c % 100 )) + $(( $c % 100 )) / 4 + $(( $c / 100 )) \* 5 + $(( $c / 400 )) + 13 \* \( 3 + 1 \) / 5 + 13 \) % 7` -eq 6 then b=`expr $b + 1` fi c=`expr $c + 1` done #ツェラーの公式を用いて、2016年から指定した年の前年までの3月13日金曜日の日数を数えます #ツェラーの公式で求めた値を7で割った余りが6の場合が金曜日となるので、その条件に合致するたびにbに1だけ加算していきます #指定された年の前年まで数え終わると処理を終わります #以下、この処理を4〜12月までのそれぞれについて行います #引数に2016を指定するとこれらの処理はスキップされます(2016年の処理については後述) while test $d -ne $1 do if test `expr \( $(( $d % 100 )) + $(( $d % 100 )) / 4 + $(( $d / 100 )) \* 5 + $(( $d / 400 )) + 13 \* \( 4 + 1 \) / 5 + 13 \) % 7` -eq 6 then b=`expr $b + 1` fi d=`expr $d + 1` done #4月の場合 while test $e -ne $1 do if test `expr \( $(( $e % 100 )) + $(( $e % 100 )) / 4 + $(( $e / 100 )) \* 5 + $(( $e / 400 )) + 13 \* \( 5 + 1 \) / 5 + 13 \) % 7` -eq 6 then b=`expr $b + 1` fi e=`expr $e + 1` done #5月の場合 while test $f -ne $1 do if test `expr \( $(( $f % 100 )) + $(( $f % 100 )) / 4 + $(( $f / 100 )) \* 5 + $(( $f / 400 )) + 13 \* \( 6 + 1 \) / 5 + 13 \) % 7` -eq 6 then b=`expr $b + 1` fi f=`expr $f + 1` done #6月の場合 while test $g -ne $1 do if test `expr \( $(( $g % 100 )) + $(( $g % 100 )) / 4 + $(( $g / 100 )) \* 5 + $(( $g / 400 )) + 13 \* \( 7 + 1 \) / 5 + 13 \) % 7` -eq 6 then b=`expr $b + 1` fi g=`expr $g + 1` done #7月の場合 while test $h -ne $1 do if test `expr \( $(( $h % 100 )) + $(( $h % 100 )) / 4 + $(( $h / 100 )) \* 5 + $(( $h / 400 )) + 13 \* \( 8 + 1 \) / 5 + 13 \) % 7` -eq 6 then b=`expr $b + 1` fi h=`expr $h + 1` done #8月の場合 while test $i -ne $1 do if test `expr \( $(( $i % 100 )) + $(( $i % 100 )) / 4 + $(( $i / 100 )) \* 5 + $(( $i / 400 )) + 13 \* \( 9 + 1 \) / 5 + 13 \) % 7` -eq 6 then b=`expr $b + 1` fi i=`expr $i + 1` done #9月の場合 while test $j -ne $1 do if test `expr \( $(( $j % 100 )) + $(( $j % 100 )) / 4 + $(( $j / 100 )) \* 5 + $(( $j / 400 )) + 13 \* \( 10 + 1 \) / 5 + 13 \) % 7` -eq 6 then b=`expr $b + 1` fi j=`expr $j + 1` done #10月の場合 while test $k -ne $1 do if test `expr \( $(( $k % 100 )) + $(( $k % 100 )) / 4 + $(( $k / 100 )) \* 5 + $(( $k / 400 )) + 13 \* \( 11 + 1 \) / 5 + 13 \) % 7` -eq 6 then b=`expr $b + 1` fi k=`expr $k + 1` done #11月の場合 while test $l -ne $1 do if test `expr \( $(( $l % 100 )) + $(( $l % 100 )) / 4 + $(( $l / 100 )) \* 5 + $(( $l / 400 )) + 13 \* \( 12 + 1 \) / 5 + 13 \) % 7` -eq 6 then b=`expr $b + 1` fi l=`expr $l + 1` done #12月の場合 while test $m -ne $1 do if test `expr \( $(( $m % 100 )) + $(( $m % 100 )) / 4 + $(( $m / 100 )) \* 5 + $(( $m / 400 )) + 13 \* \( 13 + 1 \) / 5 + 13 \) % 7` -eq 6 then b=`expr $b + 1` fi m=`expr $m + 1` done #次に、2016年から指定された年の前年までの13月13日の金曜日(2017年から指定された年までの1月13日の金曜日)の日数を加算します while test $n -ne $1 do if test `expr \( $(( $n % 100 )) + $(( $n % 100 )) / 4 + $(( $n / 100 )) \* 5 + $(( $n / 400 )) + 13 \* \( 14 + 1 \) / 5 + 13 \) % 7` -eq 6 then b=`expr $b + 1` fi n=`expr $n + 1` done #同様にして、2016年から指定された年の前年までの14月13日の金曜日(2017年から指定された年までの2月13日の金曜日)の日数を加算します while test $o -ne 13 do if test `expr \( $(( $1 % 100 )) + $(( $1 % 100 )) / 4 + $(( $1 / 100 )) \* 5 + $(( $1 / 400 )) + 13 \* \( $o + 1 \) / 5 + 13 \) % 7` -eq 6 then b=`expr $b + 1` fi o=`expr $o + 1` done #最後に、指定した年の3〜12月までの13日の金曜日の日数を数えてbに加算します #2016を引数とした場合はこの部分の繰り返しのみが実行されます(2016年1月、2月の13日が金曜日でないことを既知としています) if [ $1 -ge 2016 ] then echo $b'日' fi #2016年以降の年を指定すると、合計の日数、すなわちbの値を出力します