【Mac】日付を入力すると曜日を返すスクリプト

曜日を返すスクリプト、タイトル

筆者はかつて、イベント情報を扱う仕事をちょっとだけやっていて、イベント当日が何曜日かを調べなくてはならないことがよくあった。
 カレンダーをめくるのがダルいので、以下のようなスクリプトを書いて対応していた。

date コマンドを使う

📝 yobi.sh

#!/bin/zsh
#
# 曜日を調べる。
# 2020年12月8日なら、「yobi.sh 20201208」というように引数をつける。
#

week=$(date -j -f "%Y%m%d" "$1" +"%w")

yobi=""

if test $week -eq 0; then
    yobi='日曜日'
elif test $week -eq 1; then
    yobi='月曜日'
elif test $week -eq 2; then
    yobi='火曜日'
elif test $week -eq 3; then
    yobi='水曜日'
elif test $week -eq 4; then
    yobi='木曜日'
elif test $week -eq 5; then
    yobi='金曜日'
elif test $week -eq 6; then
    yobi='土曜日'
else
    yobi='不明'
fi

echo $yobi

少し書き直したけど、だいたい上のような感じ。
 ほとんどの場合、これで事足りてたんだけど、先日。
「赤穂浪士の討ち入りの日って何曜日だったんだろ」
 みたいなことを思って、このスクリプトで調べてみることにした。

wikipedia いわく、討ち入りの日を西暦に直すと 1703 年 1 月 30 日になるらしい。毎年 12 月 14 日に「きょうは討ち入りの日かぁ」などと感慨にふけっていたのだが、筆者はなにやってたんだろう。
 それはともかく、ご自慢のスクリプトに「yobi.sh 17030130」とやってみたら、もう、どうかっちゅうくらい怒られた。

% yobi.sh 17030130
date: nonexistent time
/Users/user/bin/yobi2.sh:test:11: unknown condition: -eq
/Users/user/bin/yobi2.sh:test:13: unknown condition: -eq
/Users/user/bin/yobi2.sh:test:15: unknown condition: -eq
/Users/user/bin/yobi2.sh:test:17: unknown condition: -eq
/Users/user/bin/yobi2.sh:test:19: unknown condition: -eq
/Users/user/bin/yobi2.sh:test:21: unknown condition: -eq
/Users/user/bin/yobi2.sh:test:23: unknown condition: -eq
不明

なんか、あんまり古い時代の日付は駄目みたい。
 1900 年より前になると駄目っぽい。
 ま、別にそこまで討ち入りの曜日を知りたかったわけでもないので、どうでも良かったのだが、ふと思いついてしまった。
 cal コマンドがあるじゃん。

cal コマンドを使う

cal コマンドは、cal 月 西暦というふうに引数をつければ、見たい年、見たい月のカレンダーを表示してくれる。
 赤穂浪士の討ち入りの年の 1 月のカレンダーは以下の通りだ。

% cal 1 1703
      1月 1703
日 月 火 水 木 金 土
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

土曜日である。
 赤穂浪士が吉良邸に討ち入ったのは土曜日である。
 へぇ……。という程度の熱量の知識が得られた。
 それより cal すげーな、という話なんだけど、さすがの cal も紀元前のカレンダーは出せない。そのかわり、1〜9999 年まで表示できる。

これにもとづいて、yobi.sh を書き直してみた。

📝 yobi.sh

#!/bin/zsh
#
# 曜日を調べる。
# 2020年12月8日なら、「yobi.sh 2020 12 8」というように引数をつける。
#

tgday=$3

henkan() {
    if test $1 -eq 0; then
        yobi='日曜日'
    elif test $1 -eq 1; then
        yobi='月曜日'
    elif test $1 -eq 2; then
        yobi='火曜日'
    elif test $1 -eq 3; then
        yobi='水曜日'
    elif test $1 -eq 4; then
        yobi='木曜日'
    elif test $1 -eq 5; then
        yobi='金曜日'
    elif test $1 -eq 6; then
        yobi='土曜日'
    else
        yobi='不明'
    fi

    echo $yobi
}

bingo() {
    num=0
    mikke=0
    for w in $@
    do
        w=$(echo $w | sed -e 's/[^0-9]//g')
        if test "$w" -eq "$tgday"; then
            mikke=1
            break
        else
            num=$(echo $((num + 1)))
        fi
    done

    if test $mikke -eq 1; then
        echo $num
    else
        echo 'none'
    fi
}

weeks=$(cal "$2" "$1")
first=($(echo $weeks | sed -n '3p'))

wk_index=$(echo ${#first[*]})
if test $wk_index -ne 7; then
    zero=$(echo $((7 - wk_index)))
    add_zero=()
    for i in `seq 1 $zero`
    do
        add_zero+=(0) 
    done
    first=($(echo ${add_zero[@]} ${first[@]}))
fi

first_try=$(bingo ${first[@]})
if test $first_try != 'none'; then
    henkan $first_try
    exit 0
else
    gyo=$(echo $weeks | wc -l | sed -e 's/ //g')
    for wn in $(seq 4 $gyo)
    do
        week=($(echo $weeks | sed -n "$wn"'p'))
        if test -z ${week[1]}; then
            exit 0
        else
            second_try=$(bingo ${week[@]})
            if test $second_try != 'none'; then
                henkan $second_try
                break
                exit 0
            fi
        fi
    done
fi

偉そうにいうようなもんでもないけど。
 cal で出力されるカレンダーを一行ずつ配列に入れていって、その配列を for で回し、引数の日付と照らしあわせる。同時に数字をカウントしており、何周目にヒットしたか、で曜日にたどり着く、という感じ。
 ただし月の第一週だけは日数が足らないことが多いので配列に 0 を足している。例えばその月の一日が水曜日から始まる場合は、数字が 4 つしかなく、for で数字をカウントしても正確な曜日にたどり着けないのである。

ともかく。
 これさえあれば我々は、キリストは何曜日に生まれたのか、という考古学的に価値のある事実を調査できることになる。それは西暦 1 年 12 月 25 日のこととされている。

% yobi.sh 1 12 25
日曜日

日曜日である。
 イエス・キリストは日曜日に生まれたのである。ジーザス。
 まぁキリスト生誕の日は諸説あるらしいが。

このスクリプトをもちいて、自分の生まれた日の曜日を調べ、タイやミャンマーでよく行われる曜日占いを試すのも一興だろう。ただし曜日占いはビルマ暦で占うらしいので、あまり意味はないが。

🔗 あなたの生まれ曜日で性格診断します|曜日占い