【Linux】bashを使って文字列が日付に変換できるかチェックする | 人生のエラー集

人生のエラー集

バグ出し率トップを誇るへっぽこプログラマーが発生させたエラーをメモのために残します。
同じエラーで悩む人の解決策になりますように…

趣味のことも書いたりしますが。

あれは初めてシェルを作った時のことでした。
bashで試行錯誤しながら意味不明なコマンドをたくさん書いているときに、仕様変更。
起動引数に日付を渡してくれ、その引数が日付かどうかは一応チェックしてくれとのこと。
渡された引数は文字列なわけで、正しい日付かどうかはチェックしてみないとわからない。
Javaなら簡単なんだけど、bashではどうやるんだろう?そんな便利なコマンド用意してあるのかな?
と思いながらgoogleさんに聞いてみました。

見つかりませんでした。。。
仕方がないから自分で作ろう!そう思って書いてみたコードを公開します!

#!/bin/bash

#第一引数を受け取る

ACT_DATE=$1

#未入力検査

if [ "$ACT_DATE" == "" ] ; then
     
     echo "引数が設定されていません。"
     
     exit 1

#ここが最重要ポイント!!日付かどうか判定。日付ではない場合、trueになる

elif [ `date -d $ACT_DATE > /dev/null 2>&1; echo $?` -ne 0 ] ; then

     echo "引数の値は日付ではありません"

     exit 1

fi
以上でした!
この時は桁数のチェックは行いませんでした。
必要な場合は、未入力チェックの後ですかねー
コマンドの内容ですが、
date -d $ACT_DATE
で日付になるか判定しています。

例えば、正しい日付
date -d 19880921
と入力すると、
1988年 9月 21日 土曜日 00:00:00 JST
と出力されます。

また、誤った日付
date -d 19880931
と入力すると、
date: invalid date `19880931`
という結果が返ってきます。

ただ、今回のIF文では結果の返却が不要なので、
> /dev/null 2>&1
で出力しないようにしました。
そして、
; echo $?
ですが、「date -d 日付」の実行結果として正しい日付の場合に0、誤った日付の場合に1が返ってきます。
これを利用して「-ne 0」で何かしら問題があった場合を不正としました。

解説は終了です。
ググっても見つからないってことは必要としている人が少ないってことかな?
なんて思ったりもしましたけど、一応公開しておきます。

日付のチェックができなかった自分に、さようなら。