script bash que lee la entrada del usuario y usa el comando "cal" para validar las fechas

script bash que lee la entrada del usuario y usa el comando "cal" para validar las fechas

Quiero escribir un script que lea mi entrada (por ejemplo, si mi script se llama "check", entonces escribiría "check 9 4 1993" y esa entrada pasará por el comando cal y verificará en el calendario si es así). una fecha válida o no).

Mi idea a continuación es que si la entrada que pasa por el comando cal da un error, significará que no es una fecha válida, y viceversa, si no hay ningún error, la fecha es válida. Me doy cuenta de que hay algo terriblemente mal en este borrador (no sé cómo hacer que mis entradas pasen por el comando cal), pero agradeceré algunas sugerencias. Aquí está el borrador de todos modos:

#!/bin/bash

day=$1; month=$2; year=$3
day=$(echo "$day" | bc)
month=$(echo "$month" | bc)
year=$(echo "$year" | bc)

cal $day $ month $year 2> /dev/null
if [[$? -eq 0 ]]; then
   echo "This is a valid date"
else
   echo "This is an invalid date"
fi

Respuesta1

En algunas distribuciones de Linux que he comprobado (por ejemplo, Ubuntu 14.04), el paquete calproviene de BSD y no de GNU Coreutils. La versión BSD no parece aceptar días como parámetro; sólo meses y años. La versión de Ubuntu tiene la opción -H AAAA-MM-DD, pero eso no parece ayudar.

En su lugar, usaría la dateutilidad. Suponiendo GNU Coreutils en Linux, creo que reescribiría su script de manera similar a:

#!/bin/bash

day=$((10#$1))
month=$((10#$2))
year=$((10#$3))

if date -d $year-$month-$day > /dev/null 2>&1; then
    # cal $month $year
    echo "This is a valid date"
else
    echo "This is an invalid date"
fi

Notas:

  • Estoy usando el propio shell.expansión aritméticapara validar la entrada/eliminar ceros a la izquierda, en lugar de bifurcar un nuevo bcproceso para cada parámetro
  • estoy usandofecha GNUpara analizar la fecha de entrada
  • El comando de fecha se puede utilizar directamente como ifexpresión condicional. iffunciona comprobando los códigos de salida del proceso. Comúnmente se usan los ejecutables [o [[en su lugar, pero no hay ninguna razón por la que se puedan usar otros programas si salen con códigos de salida útiles.
  • No estoy seguro de si realmente deseaba obtener el calresultado con las fechas correctas o no. Si lo hace, simplemente descomente la callínea.

Respuesta2

[[es en realidad un comando y, al igual que otros comandos, necesitas espacios en blanco para separar sus argumentos:

if [[ $? -eq 0 ]]; then
# ...^

Respuesta3

Hay un espacio entre su dólar $y su monthvariable:

cal $day $ month $year 2> /dev/null

Debería ser:

cal $day $month $year 2> /dev/null

Respuesta4

Si escribe la fecha con el formato "%Y-%m-%d" o "%m/%d/&Y" (por ejemplo, 2020-11-29 o 11/29/2020), puede verificar la validez de la fecha usando gnu fecha (gdate) como esta:

gdate -d "$1" +'%Y-%m-%d' > /dev/null 2>&1  # don't display any output
status=$(echo $?)                           # get error code
if [[ $status = 1 ]]                        # if date is invalid
then
  { echo "This date doesn't exist. Enter valid date!"; exit 1; }
else
  ...

Espero haber respondido bien a la pregunta y que esto ayude a alguien. Seguro que funcionó para mí :)

información relacionada