Validar formato de fecha en un script de shell

Tengo que crear un script de shell en el que uno de los parámetros será la fecha en el formato dd / mm / aaaa. Mi pregunta es, ¿cómo puedo verificar si la fecha pasada como parámetro realmente sigue este formato de fecha? Traté de usar el comando grep de la siguiente manera:

if echo "$1" | grep -q '^[0-3][0-9]/[0-1][0-9]/[0-9]\{4\}$' 

pero no dio el formato correcto porque el día, por ejemplo, puede ser 33, 34, (…), ese no es realmente el formato correcto. Alguien sabe algo que realmente puede verificar si la fecha aprobada realmente sigue el formato dd / mm / aaaa?

Usar fecha

 date "+%d/%m/%Y" -d "09/99/2013" > /dev/null 2>&1 is_valid=$? 

Si no obtienes 0, entonces la fecha está en formato inválido.

La solución más simple, que todavía funciona perfectamente, es la siguiente:

 if [[ $1 =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && date -d "$1" >/dev/null 2>&1 ... 

Consiste en combinar 2 controles:

  • la primera parte verifica que $1 tiene este formato: NNNN-NN-NN
  • la segunda parte verifica que sea una fecha válida

Necesitas los dos controles porque:

  • si no haces el primer cheque, la date saldrá con el código 0 incluso si tu variable es una fecha válida en otro formato
  • si no haces el segundo control, entonces puedes terminar con un 0 incluso para variables como 2016-13-45

Primero, verifica la forma de la entrada usando la expresión regular. Luego use awk para cambiar a mm / dd / aaaa y use la fecha para validar. Puede usar la siguiente expresión en su statement 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 

La forma más simple para dd/mm/yyyy exactamente en Bash es:

 if [[ $1 == [0-3][0-9]/[0-1][0-9]/[0-9][0-9][0-9][0-9] ]] 

O

 if [[ $1 =~ ^[0-3][0-9]/[0-1][0-9]/[0-9]{4}$ ]] 

¿Qué tal si usas awk ?

 echo "31/12/1999" | awk -F '/' '{ print ($1 <= 31 && $2 <= 12 && match($3, /^[1-9][1-9][1-9][1-9]$/)) ? "good" : "bad" }' 

Imprime "bueno" si su fecha de validez imprime "mala"

 #! /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'` 

Aquí hay una función para hacer algo de validación de datos esto:

 # 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 } 

`X =” 2016-04-21 “luego verifique que el siguiente valor sea 1 o 0.

cal echo $x | cut -c 6-7 echo $x | cut -c 6-7 echo $x | cut -c 1-4 echo $x | cut -c 1-4 2> / dev / null | grep -c echo $x | cut -c 9-10 echo $x | cut -c 9-10

Si el valor es 1, entonces es válido, de lo contrario no es válido.

Esta función espera 2 cadenas, una cadena de formato, una cadena de fecha

La cadena de formato utiliza los códigos del comando de fecha, pero no incluye el ‘+’

La función devuelve 0 si la fecha proporcionada coincide con el formato dado; de lo contrario, devuelve 1

 datecheck() { local format="$1" d="$2" [[ "$(date "+$format" -d "$d" 2>/dev/null)" == "$d" ]] } 

Escribí este script bash para validar la fecha. Puedo aceptar mont como alfanumérico.

 #!/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 

Blockquote

 DATE = "$*" [[ "${DATE}" != @(((([123][0]|[012][1-9])|3[1])?([ \/._-])(0[13578]|1[02])?([ \/._-])(19|20)[0-9][0-9])|(([123][0]|[012][1-9])?([ \/._-])\ (0[469]|11)?([ \/._-])(19|20)[0-9][0-9])|(([12][0]|[01][1-9]|2[1-8])?([ \/._-])02?([ \/._-])(19|20)[0-9][0-9])|(29?([ \/._-])02?([ \/._-])\ (19|20(0[48]|[2468][048]|[13579][26])))) ]] && echo error || echo good)