シェルスクリプトで年月日時分(YYYYMMDDhhmm)までの日付を扱う時に、
入力された値が妥当な値(※)であるかをチェックする方法。
※
201504351020 = 2015年04月35日10時20分
201504012500 = 2015年04月01日25時00分
等の存在しない年月日時分をエラーとする。
入力が年月日(YYYYMMDD)であれば
date -d 20150401 >/dev/null 2>&1
echo $? # 0:OK 1:NG
のようにdateに食わせてチェック可能。
また、"201504011530"を"20150401 15:30"のように形式を変えて
date +'%Y%m%d %H:%M' -d "20150401 15:30"
echo $? # 0:OK 1:NG
のように12桁をバラせばdateに食わせて同じように判定に使えるようだが、
作成の都合上バラしたくない。(というかめんどくさかった。)
結局、12桁の値を"touch -t"に渡して適当なファイル(/tmp/_datetimecheck)の
タイムスタンプに設定して、設定が成功するかどうかで判定させることに。
# SetDate (YYYYMMDDhhmm)
echo -n -e " \"Set DateTime (YYYYMMDDhhmm)\" > "
read DATETIME
datetime_check $DATETIME
if [ $? -gt 0 ]; then
echo -e " \"$DATETIME is NG. Set Correct DateTime (YYYYMMDDhhmm)\""
exit 1
fi
# datetime_check() - 年月日時分チェック
# $1 : $DATETIME
# $? : 0:OK 1:NG(日付時刻異常)
function datetime_check() {
touch -t $1 /tmp/_datetimecheck >/dev/null 2>&1
return $? #"0"ならOK。"1"ならNG。
}
#その他のチェック(桁数チェック、数字以外の文字などが入力されてないか)については割愛
もっとスマートな方法があればどなたか教えてください。
というか、当初使うつもりだったdateコマンドでの方法が、
date +'%Y%m%d%H%M' -d 201504011530
date: invalid date `201504011530'
と言う風に"invalid date"と言われてしまうのか未だに分からずモヤモヤしています。