パラメータの1つがdd/mm/yyyy形式の日付になるシェルスクリプトを作成する必要があります。私の質問は、パラメーターとして渡された日付が本当にこの日付形式に従っているかどうかを確認するにはどうすればよいですか?以下のようにgrepコマンドを使用しようとしました:
if echo "$1" | grep -q '^[0-3][0-9]/[0-1][0-9]/[0-9]\{4\}$'
しかし、たとえば日が33、34、(...)になる可能性があるため、正しい形式ではありませんでした。これは実際には正しい形式ではありません。誰かが、渡された日付が実際にdd/mm/yyyyの形式に従っているかどうかを実際に確認できるものを知っていますか?
まだ完全に機能する最も単純なソリューションは次のとおりです。
if [[ $1 =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && date -d "$1" >/dev/null 2>&1
...
2つのチェックを組み合わせることで構成されます。
$1
が次の形式であることを確認します:NNNN-NN-NN
次の2つのチェックが必要です。
date
はコード0で終了します別の形式2016-13-45
などの変数でも0になる可能性があります。この関数は、2つの文字列、フォーマット文字列、日付文字列を想定しています
書式文字列は、日付コマンドからのコードを使用しますが、「+」を含みません
指定された日付が指定された形式と一致する場合、関数は0を返し、それ以外の場合は1を返します。
datecheck() {
local format="$1" d="$2"
[[ "$(date "+$format" -d "$d" 2>/dev/null)" == "$d" ]]
}
まず、正規表現を使用して入力の形式を確認します。次に、awkを使用してmm/dd/yyyyに切り替え、日付を使用して検証します。 if
ステートメントで次の式を使用できます。
echo "$1" | egrep -q '^[0-3][0-9]/[0-1][0-9]/[0-9]{4}$' && date -d "$(echo "$1" | awk 'BEGIN{FS=OFS="/"}{print $2"/"$1"/"$3}')" >/dev/null 2>&1
#! /bin/bash
isDateInvalid()
{
DATE="${1}"
# Autorized separator char ['space', '/', '.', '_', '-']
SEPAR="([ \/._-])?"
# Date format day[01..31], month[01,03,05,07,08,10,12], year[1900..2099]
DATE_1="((([123][0]|[012][1-9])|3[1])${SEPAR}(0[13578]|1[02])${SEPAR}(19|20)[0-9][0-9])"
# Date format day[01..30], month[04,06,09,11], year[1900..2099]
DATE_2="(([123][0]|[012][1-9])${SEPAR}(0[469]|11)${SEPAR}(19|20)[0-9][0-9])"
# Date format day[01..28], month[02], year[1900..2099]
DATE_3="(([12][0]|[01][1-9]|2[1-8])${SEPAR}02${SEPAR}(19|20)[0-9][0-9])"
# Date format day[29], month[02], year[1904..2096]
DATE_4="(29${SEPAR}02${SEPAR}(19|20(0[48]|[2468][048]|[13579][26])))"
# Match the date in the Regex
if ! [[ "${DATE}" =~ "^(${DATE_1}|${DATE_2}|${DATE_3}|${DATE_4})$" ]]
then
echo -e "ERROR - '${DATE}' invalid!"
else
echo "${DATE} is valid"
fi
}
echo
echo "Exp 1: "`isDateInvalid '12/13/3000'`
echo "Exp 2: "`isDateInvalid '12/11/2014'`
echo "Exp 3: "`isDateInvalid '12 01 2000'`
echo "Exp 4: "`isDateInvalid '28-02-2014'`
echo "Exp 5: "`isDateInvalid '12_02_2002'`
echo "Exp 6: "`isDateInvalid '12.10.2099'`
echo "Exp 7: "`isDateInvalid '31/11/2000'`
Bashでのdd/mm/yyyy
の最も簡単な方法は次のとおりです。
if [[ $1 == [0-3][0-9]/[0-1][0-9]/[0-9][0-9][0-9][0-9] ]]
または
if [[ $1 =~ ^[0-3][0-9]/[0-1][0-9]/[0-9]{4}$ ]]
awk
の使い方はどうですか:
echo "31/12/1999" | awk -F '/' '{ print ($1 <= 31 && $2 <= 12 && match($3, /^[1-9][1-9][1-9][1-9]$/)) ? "good" : "bad" }'
有効な日付が「悪い」と表示されている場合、「良い」と表示されます。
`X =" 2016-04-21 "次に、以下の値が1または0であることを確認します。
cal echo $x | cut -c 6-7
echo $x | cut -c 1-4
2>/dev/null | grep -c echo $x | cut -c 9-10
値が1の場合は有効であり、それ以外の場合は無効です。
これはデータ検証を行う関数です:
# Script expecting a Date parameter in MM-DD-YYYY format as input
verifyInputDate(){
echo ${date} | grep '^[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]$'
if [ $? -eq 0 ]; then
echo "Date is valid"
else
echo "Date is not valid"
fi
}
日付を検証するためにこのbashスクリプトを書きました。 montを英数字として受け入れることができます。
#!/bin/bash
function isDateValid {
DATE=$1
if [[ $DATE =~ ^[0-9]{1,2}-[0-9a-zA-Z]{1,3}-[0-9]{4}$ ]]; then
echo "Date $DATE is a number!"
day=`echo $DATE | cut -d'-' -f1`
month=`echo $DATE | cut -d'-' -f2`
year=`echo $DATE | cut -d'-' -f3`
if [ "$month" == "01" ] || [ "$month" == "1" ]; then
month="Jan"
Elif [ "$month" == "02" ] || [ "$month" == "2" ]; then
month="Feb"
Elif [ "$month" == "03" ] || [ "$month" == "3" ]; then
month="Mar"
Elif [ "$month" == "04" ] || [ "$month" == "4" ]; then
month="Apr"
Elif [ "$month" == "05" ] || [ "$month" == "5" ]; then
month="May"
Elif [ "$month" == "06" ] || [ "$month" == "6" ]; then
month="Jun"
Elif [ "$month" == "07" ] || [ "$month" == "7" ]; then
month="Jul"
Elif [ "$month" == "08" ] || [ "$month" == "8" ]; then
month="Aug"
Elif [ "$month" == "09" ] || [ "$month" == "9" ]; then
month="Sep"
Elif [ "$month" == "10" ]; then
month="Oct"
Elif [ "$month" == "11" ]; then
month="Nov"
Elif [ "$month" == "12" ]; then
month="Dec"
fi
ymd=$year"-"$month"-"$day
echo "ymd: "$ymd
dmy=$(echo "$ymd" | awk -F- '{ OFS=FS; print $3,$2,$1 }')
echo "dmy: "$dmy
if date --date "$dmy" >/dev/null 2>&1; then
echo "OK"
return 0
else
echo "NOK"
return 1
fi
else
echo "Date $DATE is not a number"
return 1
fi
}
if isDateValid "15-15-2014"; then
echo "date is valid =)"
else
echo "bad format date"
fi
echo "==================="
if isDateValid "15-12-2014"; then
echo "date is valid =)"
else
echo "bad format date"
fi
echo "==================="
if isDateValid "15-Dec-2014"; then
echo "date is valid =)"
else
echo "bad format date"
fi
echo "==================="
if isDateValid "1-May-2014"; then
echo "date is valid =)"
else
echo "bad format date"
fi
echo "==================="
if isDateValid "1-1-2014"; then
echo "date is valid =)"
else
echo "bad format date"
fi
echo "==================="
if isDateValid "12-12-2014"; then
echo "date is valid =)"
else
echo "bad format date"
fi
([[$ 1 =〜^ [0-9] {4}-[0-9] {2}-[0-9] {2} $]] && date -d "$ 1">/dev/null 2>&1)@ https://stackoverflow.com/users/2873507/vic-seedoubleyew は、少なくともLinuxには最適ですが、直接比較/照合できないためエラーになりますifステートメントの正規表現。正規表現を変数に入れ、ifステートメントでその変数を比較/一致させる必要があります。さらに、if条件の2番目の部分はブール値を返さないため、この部分でもエラーが発生します。
したがって、上記の式を少し変更しました。この変更は、他のさまざまな形式またはそれらの組み合わせに合わせてさらにカスタマイズすることもできます。
DATEVALUE=2019-11-12
REGEX='^[0-9]{4}-[0-9]{2}-[0-9]{2}$'
if [[ $DATEVALUE =~ $REGEX ]] ; then
date -d $DATEVALUE
if [ $? -eq 0 ] ; then
echo "RIGHT DATE"
else
echo "WRONG DATE"
fi
else
echo "WRONG FORMAT"
fi