Unix 日付形式検証スクリプト

Unix 日付形式検証スクリプト

私は日付形式を確認するためにこの小さなUnixシェルスクリプトを書いています。私のスクリプトは、文字列がYYYYMMDDHHMISS形式であることを確認する必要があります。この形式でない場合は、エラーメッセージが送信されます。

たとえば、変数aを宣言し、ここに値を割り当てます。

a=20150620223405
date "+%Y%m%d%H%M%S" -d $a > /dev/null 2>&1
if [ $? -ne 0 ]
then
echo "Invalid format"
else
echo "Valid format"
fi 

常に「無効」と表示されます。ここでエラーが何であるか、どのように進むべきかを知りたいです。

答え1

条件付きテストでは$?ゼロ以外の値を使用するため、テストは失敗します。ゼロ以外の理由は、dateゼロ以外の終了状態が生成されるためです。一時的にdate廃棄を中止した場合標準エラー使用すると、> /dev/null 2>&1生成されるエラーメッセージが表示されます。これは問題を特定するのに役立ちます。

date: invalid date ‘20150620223405’

これはdate日付形式が許可されていないことを意味します。

次のことを試すことができます。

a=20150620223405
b=$(echo "$a" | sed 's/^\(....\)\(..\)\(..\)\(..\)\(..\)\(..\)$/\1-\2-\3 \4:\5:\6/')
c=$(date "+%Y%m%d%H%M%S" -d "$b" 2>/dev/null)
if test $? -eq 0 -a "$c" = "$a"
then
    echo ok
else
    echo not ok
fi

関連情報