私のスクリプトが受け取る引数の1つは、yyyymmdd
という形式の日付です。
入力として有効な日付が得られるかどうかを確認したいです。
これどうやってするの?私は次のような正規表現を使用しようとしています:[0-9]\{\8}
あなたは言うことができます:
[[ $date =~ ^[0-9]{8}$ ]] && echo "yes"
もっと正確:
[[ $date =~ ^[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ ]] && echo "yes"
# |^^^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^^^^^ ^^^^^^ |
# | | ^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ |
# | | | | |
# | | \ | |
# | --year-- --month-- --day-- |
# | either 01...09 either 01..09 end of line
# start of line or 10,11,12 or 10..29
# or 30, 31
つまり、あなたが望むフォーマットにマッチする正規表現をbashで定義することができます。このようにあなたがすることができます:
[[ $date =~ ^regex$ ]] && echo "matched" || echo "did not match"
これはAleks-Daniel Jakimenkoによる ユーザー入力日付形式の検証(bash) による解決策に基づいていることに注意してください。
他のシェルでは grep を使うことができます。シェルがPOSIXに準拠している場合は、
(echo "$date" | grep -Eq ^regex$) && echo "matched" || echo "did not match"
POSIXに準拠していない fish で、あなたはすることができます
echo "$date" | grep -Eq "^regex\$"; and echo "matched"; or echo "did not match"
Bashバージョン3では、 '=〜'演算子を使うことができます。
if [[ "$date" =~ "[0-9]\{8\}" ]]; then
echo "Valid date"
else
echo "Invalid date"
fi
参照: http://tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF
注:二重括弧[[]]内のマッチング演算子での引用は、Bashバージョン3.2以降では必要なくなりました。
文字列が正しい日付であるかどうかをテストするのに良い方法は、dateコマンドを使うことです。
if date -d "${DATE}" >/dev/null 2>&1
then
# do what you need to do with your date
else
echo "${DATE} incorrect date" >&2
exit 1
fi
expr match
の代わりに=~
を使用します。
expr match "$date" "^[0-9]\{8\}" >/dev/null && echo yes
=~
は空の文字列にも一致するため、これは=~
を使用するという現在受け入れられている答えよりも優れています。 badvar
が定義されていないと仮定すると、[[ "1234" =~ "$badvar" ]]; echo $?
は(誤って)0
を与えますが、expr match "1234" "$badvar" >/dev/null ; echo $?
は正しい結果1
を与えます。
>/dev/null
の 出力値 を一致させない場合はexpr match
を使用する必要があります。一致する文字が見つからなかった場合は0です。 出力値 は 終了ステータス とは異なることに注意してください。一致が見つかった場合は終了ステータスは0、それ以外の場合は1です。
通常、expr
の構文は次のとおりです。
expr match "$string" '$substring'
または
expr "$string" : '$substring'
$substring
は正規表現です。
正規表現の使用が日付の文字シーケンスが正しいかどうかを判断するのに役立つ場合がある場合、日付が有効であるかどうかを判断するのに簡単に使用することはできません。次の例では正規表現を渡しますが、すべて無効な日付です。20180231、20190229、20190431
そのため、日付文字列(datestr
と呼びましょう)が正しい形式であるかどうかを検証したい場合は、date
を使用して解析し、date
に正しい形式に変換するよう依頼するのが最善です。両方の文字列が同じ場合は、有効な形式と有効な日付があります。
if [[ "$datestr" == $(date -d "$datestr" "+%Y%m%d" 2>/dev/null) ]]; then
echo "Valid date"
else
echo "Invalid date"
fi