Validación de fecha de entrada de usuario de script de Shell

Validación de fecha de entrada de usuario de script de Shell

¿Cómo haría para realizar la validación de la fecha en la entrada del usuario en un script de shell? Quiero notificar al usuario si ingresa la fecha en el formato incorrecto. El formato correcto sería AAAAMMDD.

Respuesta1

Este método trata la entrada como una cadena, luego la analiza y prueba para determinar si tiene el formato adecuado. En este formulario, también comprobo si los campos de la fecha son correctos, pero puedes eliminar esos condicionales si no los necesitas.

#!/bin/bash
echo -n "Enter the date as YYYYMMDD >"
read date
if [ ${#date} -eq 8 ]; then
    year=${date:0:4}
    month=${date:4:2}
    day=${date:6:2}
    month30="04 06 09 11"
    leapyear=$((year%4)) # if leapyear this is 0
    if [ "$year" -ge 1901 -a "$month" -le 12 -a "$day" -le 31 ]; then
            if [ "$month" -eq 02 -a "$day" -gt 29 ] || [ "$leapyear" -ne 0 -a "$month" -eq 02 -a "$day" -gt 28 ]; then
                    echo "Too many days for February... try again"; exit
            fi
            if [[ "$month30" =~ "$month" ]] && [ "$day" -eq 31 ]; then
                    echo "Month $month cannot have 31 days... try again"; exit
            fi
    else echo "Date is out of range"; exit
    fi
else echo "try again...expecting format as YYYYMMDD"; exit
fi
echo "SUCCESS!"
echo "year: $year  month: $month  day: $day"

Respuesta2

Es posible que le guste la opción de aceptar muchos formatos y convertirlos al formato estándar; el datecomando puede ayudar:

$ day=$(unset day;
        until date -d "${day:-XXX}" '+%Y%m%d' 2>/dev/null
          do read -p "Which day? " day
        done)
Which day? 
Which day? weds 
Which day? friday
$ echo $day
20150508

información relacionada