【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
日曜日
日曜日である。
イエス・キリストは日曜日に生まれたのである。ジーザス。
まぁキリスト生誕の日は諸説あるらしいが。
このスクリプトをもちいて、自分の生まれた日の曜日を調べ、タイやミャンマーでよく行われる曜日占いを試すのも一興だろう。ただし曜日占いはビルマ暦で占うらしいので、あまり意味はないが。
最近のコメント