日付パラメータが正しい形式(YYYY-MM-DD)であることを確認する方法はありますか?
Webからこれを得ましたが、私にはうまくいきません。
date "+%Y-%m-%d" -d "2015-10-11" > /dev/null 2>&1
echo $?
結果が出ると予想したが、0
そうではなかった。誰か他の方法を教えてもらえますか?
答え1
bash
次に、以下で正しい形式(YYYY-MM-DD)を確認します(組み込み正規表現一致を使用)。
if [[ $1 =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]
then echo "Date $1 is in valid format (YYYY-MM-DD)"
else echo "Date $1 is in an invalid format (not YYYY-MM-DD)"
fi
ランニング:
./script.sh 2015-12-10
出力:
Date 2015-12-10 is in valid format (YYYY-MM-DD)
日付自体が有効であることを確認せずに日付のみを確認してください。滞在(質問に記載されているように、「日付パラメータが正しい形式(YYYY-MM-DD」)であることを確認してください。)
日付形式を確認する必要がある場合そして日付値を確認するには、以下を試してください。
if [[ $1 =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && date -d "$1" >/dev/null
then echo "Date $1 is valid and matches the format (YYYY-MM-DD)"
fi
これにより、0000-88-77などの正規表現に一致する無効な日付が削除されます。
(この提案について@glenn jackmanに感謝します。)
答え2
オペレーティングシステムにタグを付けておらず、現在Linuxを使用しているので、ksh
おそらくLinuxを使用していないと思います。可能Solarisを使用してください。あなたが提供したコマンドはdate
機能しますが(または)がGNUの改善であるdate
GNU用です。-d
--date
したがって、簡単なオプションはGNUを使用することですdate
。 GNU coreutilsパッケージをインストールする必要があるかもしれません、すでにパッケージを持っているかもしれません(/usr/sfw/bin
Solarisでチェックイン)、すでに利用可能または提供されるgdate
かもしれませんgnudate
。これは、YYYY-MM-DD形式の日付を正しく検証します(2015-31-01を許可する他の正規表現の例とは異なり)。
代わりに、次touch
のような状況でコマンドを使用できます。移植性の向上(POSIX)方法
touch -c -d 2015-12-12T00:00:00 /tmp/does-not-exist
- これを使用する
-c
とファイルは生成されません - 有効なタイムスタンプを設定するには、日付にT00:00:00を追加してください。
(ただし、Solarisを使用している場合、一部のバージョンでは欠落しているだけでなく、一部のバージョンでは検証されませんが、-d
巧妙に努力するバグ/バギー機能が少なくともあることがわかりました。 03-01"になり、エラーがないため、日付確認にはこのバージョンを使用できません。)
gawk
mawk
私はこのアプローチを好みます。このアプローチは強力で移植性が高く(または逆に従来のアプローチではnawk
これらの時間機能が不足している)と仮定します。
#!/usr/local/bin/gawk -f
BEGIN{
split(ARGV[1],bb,/-/)
tm=mktime( bb[1] " " bb[2] " " bb[3] " 00 00 00")
tms=sprintf("%04i-%02i-%02i",bb[1],bb[2],bb[3])
if (tms==strftime("%Y-%m-%d",tm)) exit 0
exit 1
}
~上
- 「-」文字で区切られた最初のパラメーターを受け入れます。
mktime()
指定されたYYYY-MM-DDのエポックタイムスタンプを確認してください。sprintf()
正規化されたYYYY-MM-DD(先行0)strftime()
Epoch時間をYYYY-MM-DDに変換し、文字列で比較します。
追加の変換と比較を行う理由は、mktime()
Linuxのglibcの場合と同様に、Cライブラリが問題のある日付を再解釈する状況を捉えることです(touch
上記のSolarisでも同じ問題)。
YYYY-MM-DDの正しい形式については、関心を意味する場合とそうでない場合があります。有効性日付(何かがdate
完了します)は、削除することもできることを意味するかもしれません。YYYY-DD-MM形式の日付。形式が「日付に似ている」ことを確認するには、正規表現で十分です。
grep -qE "^[0-9]{4}-[01]?[0-9]-[0123]?[0-9]$"
grep -qE "^[12][0-9]{3}-(0?[1-9]|10|11|12)-(0?[1-9]|[12][0-9]|3[01])$"
(Solarisでは/usr/xpg4/bin/grep
デフォルト値は使用されませんgrep
。)最初のものはほとんどの偽の日付を拒否し、2番目はほとんどすべての偽の日付を拒否します。これにより-q
出力がなくなり、期待どおりに戻りコードを使用できます。^...$
2015-12-12345などの有効な部分文字列と単純に一致しないようにアンカー()または正規表現を制限することに注意してください。
答え3
日付が正しい形式であることを確認するには、正規表現を作成する方法を学ぶ必要があります。年月日
簡単な方法は、この行を1行で実行して、日付と正規表現で作業し、すばやく学習できるようにすることです。
echo
日付を生成してegrep
正規表現を適用し、一致するものがあるかどうかを表示するために使用します。マニュアルページを見ると、一致数を印刷するオプションがegrep
あることが-c
わかり、日付のみを送信するため、一致が見つかったかどうかに応じて数が0または1になります。
これはあなたが遊ぶことができる1つのライナーです。
echo 0000-00-00 |egrep -c -e 'regular-expression-in-here'
正規表現の挿入(次から行うことができます)AP通信あなたの答えに提供されます)それがどれだけうまく機能するかを確認してください。日付を変更して有効性を確認してください。ここで少し違う別のものがあります。
[0-9]{4}-[0-1][0-9]-[0-3][0-9]
答え4
date
日付出力を簡単に比較して、元の値と一致することを確認できます。
d="2015-10-11"
if [ "`date '+%Y-%m-%d' -d $d 2>/dev/null`" = "$d" ]
then
echo $d is a valid YYYY-MM-DD date
else
echo $d is NOT a valid YYYY-MM-DD date
fi