私は日付形式を確認するためにこの小さな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