日付判定について

シェルスクリプトを書くときに引数として日付を渡したいときがあります。

そのときに、渡された日付がちゃんとした日付フォーマットになっているか確認したいときに使える日付判定スクリプトです。

以下の項目をチェックし、全て OK なら問題ない日付フォーマットとします。

  • wc を使って文字が 8Bytes かチェック
  • date を使って日付フォーマットかチェック
  • grep を使って 8文字の数字パターンチェック
#!/bin/bash

#### シェルに渡された引数取得
DATE="$1"

#### 改行を除いた文字の Bytes 数取得
#### wc -c の結果には、改行も含まれるので改行は、取り除く
DATE_CHARS=`echo $DATE | tr -d '\n' | wc -c`

#### 数字 8文字パターンチェック
#### 正常 : 0
#### 異常 : 0 以外
#MATCH='[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
#echo "$DATE" | grep -w "$MATCH"  > /dev/null 2>&1
MATCH='[0-9]{8}'
echo "$DATE" | grep -wE "$MATCH"  > /dev/null 2>&1
RES_1=$?

#### 日付フォーマットチェック
#### 正常 : 0
#### 異常 : 0 以外
date +%Y%m%d --date "$DATE" > /dev/null 2>&1
RES_2=$?

#### 上記の全てを判定する
#### 1. 文字数が 8文字か
#### 2. その 8文字は、全て数字か
#### 3. その 8文字は、日付フォーマットか
if [ $DATE_CHARS -eq 8 -a $RES_1 -eq 0 -a $RES_2 -eq 0 ]; then
    echo "正しい日付フォーマットです!"
else
    echo "日付フォーマットではありません!"
fi
$ ./check_date.sh abcd
日付フォーマットではありません!

$ ./check_date.sh abcd1234
日付フォーマットではありません!

$ ./check_date.sh 1234
日付フォーマットではありません!

$ ./check_date.sh 12345678
日付フォーマットではありません!

$ ./check_date.sh 20150714
正しい日付フォーマットです!

wc -c について

バイト数を取得する wc -c の結果には、改行もカウントされるため、単純に入力した文字数のバイト数だけ取得するためには、tr を使って改行を取り除きます。

$ echo 20150704 | wc -c

9

$ echo 20150704 | tr -d '\n' | wc -c

8

上記のシェルスクリプトでは、2重・3重でチェックしていますが、実は date +%Y%m%d --date "$DATE" 判定だけでよいので、状況に応じて使ってください。

以上、シェルスクリプト日付判定 でした。