Contar el número de días del mes actual

DarkBune Mensajes publicados 215 Fecha de registro   Estado Miembro Última intervención   -  
tuxboy Mensajes publicados 1083 Estado Miembro -
Hola,

me gustaría crear un script que muestre el número de días del mes actual
aquí está mi script

#! /bin/bash

MES=$(date +"%m") case $MES in 01) NOMBRE="enero";; 02)
NOMBRE="febrero";; 03) NOMBRE="marzo";; 04) NOMBRE="abril";; 05) NOMBRE="mayo";; 06) NOMBRE="junio";;
07) NOMBRE="julio";; 08) NOMBRE="agosto";; 09) NOMBRE="septiembre";; 10) NOMBRE="octubre";; 11) NOMBRE="noviembre";; 12) NOMBRE="diciembre"; echo "31 días en "$NOMBRE" "$AÑO;; 04|06|09|11) echo "30 días en "$NOMBRE" "$AÑO;;
02) BISSEXTILIDAD=$(expr $AÑO % 4) if [ $BISSEXTILIDAD != 0 ] then echo "28 días en "$NOMBRE" "$AÑO
else BISSEXTILIDAD=$(expr $AÑO % 100) if [ $BISSEXTILIDAD != 0 ] then echo "29 días en "$NOMBRE" "$AÑO
else BISSEXTILIDAD=$(expr $AÑO % 400) if [ $BISSEXTILIDAD != 0 ] then echo "28 días en "$NOMBRE" "$AÑO
else echo "29 días en "$NOMBRE" "$AÑO fi fi fi;; esac

no entiendo, me muestra un error en la línea 1

Gracias

6 respuestas

  1. le hollandais volant Mensajes publicados 5294 Estado Miembro 1 059
     
    Hola,

    En bash es mucho más simple:

    El siguiente código:
    date -d "-$(date +%d) days + 1 month" +%d


    muestra la cantidad de días del mes actual.
    El comando "date" permite realizar cálculos en lenguaje natural, por ejemplo diciendo « hoy + 1 año + 1 mes - 3 días ».

    Para mostrar texto alrededor de este número:
    date -d "-$(date +%d) days + 1 month" +"%d días en %B"


    El funcionamiento del comando presentado es el siguiente:

    date +%d

    devuelve el día actual (14, para el 14 de octubre).

    $(date +%d)

    Coloca el día en un número, una variable.

    -$(date +%d) days 

    resta (-) el número (14) de días (days). Para hoy, diría « -14 days ».

    date -d "-$(date +%d) days"

    Muestra la fecha correspondiente a la fecha actual -14 días. Es decir, el último día del mes anterior.

    date -d "-$(date +%d) days + 1 month"

    Como queremos el mes actual, hay que añadir un mes.
    Aquí se muestra la fecha completa del último día de este mes.

    Si solo queremos el día (31, para este mes), añadimos +%d :

    date -d "-$(date +%d) days + 1 month" +%d


    En otros lenguajes de programación (por ejemplo en JS para mí en este momento), es común hacerlo así: se toma el primer día de un mes dado (1 de octubre), se añade un mes (1 de noviembre) y se resta un día (31 de octubre), y así se obtiene el último día del mes.
    4
    1. DarkBune Mensajes publicados 215 Fecha de registro   Estado Miembro Última intervención   9
       
      Hola, gracias por su maravillosa explicación

      cuando ejecuto su script, me aparece esto: "fecha: fecha incorrecta "- 14 días + 1 mes "
      0
      1. le hollandais volant Mensajes publicados 5294 Estado Miembro 1 059 > DarkBune Mensajes publicados 215 Fecha de registro   Estado Miembro Última intervención  
         
        ¿Lo copió y pegó o lo transcribió?

        En su mensaje, escribe "mouth" cuando en realidad es "month".
        0
  2. zipe31 Mensajes publicados 34620 Fecha de registro   Estado Colaborador Última intervención   6 501
     
    Hola,

    ¿Tu script aparece tal cual en tu editor de texto?

    En lugar de poner un punto y coma (;) entre cada instrucción, al menos pon un retorno de línea, aunque sea por legibilidad ;-(

    --
    _______________________________ ☯ Zen my nuggets ☮ ______________________________
    Haz un gesto por el medio ambiente, cierra tus ventanas y adopta un pingüino… 🐧
    0
    1. DarkBune Mensajes publicados 215 Fecha de registro   Estado Miembro Última intervención   9
       
      Hola, sí, lo hago con el comando "nano", ¿o han notado algún error? Gracias.
      0
      1. zipe31 Mensajes publicados 34620 Fecha de registro   Estado Colaborador Última intervención   6 501 > DarkBune Mensajes publicados 215 Fecha de registro   Estado Miembro Última intervención  
         
        No porque es ilegible e indigesto.

        Dale formato y vuelve a publicar tu código entre las etiquetas
        <código>
        </código>
        y luego decidiremos ;-\
        0
  3. DarkBune Mensajes publicados 215 Fecha de registro   Estado Miembro Última intervención   9
     


    Tengo este error.
    0
  4. DarkBune Mensajes publicados 215 Fecha de registro   Estado Miembro Última intervención   9
     


    => mi editor
    0
    1. zipe31 Mensajes publicados 34620 Fecha de registro   Estado Colaborador Última intervención   6 501
       
      Como se dijo arriba, cada instrucción debe estar en una línea diferente o separada por un punto y coma (;)!

      No debe haber espacio entre "$" y "(" (fuente del primer error).
      0
  5. djacidj
     
    Aquí está la respuesta a su pregunta.

    Sin embargo, me gustaría poder ingresar una fecha y un mes para obtener una respuesta.

    ¿Puede ayudarme?


    #!/bin/bash
    MES=$(date +"%m")
    case $MES in
    01) NOMBRE="enero";;
    02) NOMBRE="febrero";;
    03) NOMBRE="marzo";;
    04) NOMBRE="abril";;
    05) NOMBRE="mayo";;
    06) NOMBRE="junio";;
    07) NOMBRE="julio";;
    08) NOMBRE="agosto";;
    09) NOMBRE="septiembre";;
    10) NOMBRE="octubre";;
    11) NOMBRE="noviembre";;
    12) NOMBRE="diciembre";;
    esac
    AÑO=$(date +"%Y")
    case $MES in
    01|03|05|07|08|10|12)
    echo "31 días en $NOMBRE $AÑO";;
    04|06|09|11)
    echo "30 días en "$NOMBRE" "$AÑO;;

    02)
    BISESTRAL=$(expr $AÑO % 4)
    if [ $BISESTRAL != 0 ]
    then
    echo "28 días en "$NOMBRE" "$AÑO
    else
    BISESTRAL=$(expr $AÑO % 100)
    if [ $BISESTRAL != 0 ]
    then
    echo "29 días en "$NOMBRE" "$AÑO
    else
    BISESTRAL=$(expr $AÑO % 400)
    if [ $BISESTRAL != 0 ]
    then
    echo "28 días en "$NOMBRE" "$AÑO
    else
    echo "29 días en "$NOMBRE" "$AÑO
    fi
    fi
    fi

    esac



    GRACIAS DE ANTEMANO
    0
    1. UnGnU Mensajes publicados 1468 Estado Colaborador 158
       
      Hola,

      Basta con solicitarlo al principio del script (comando "
      read
      ") en lugar de escribirlo en duro.
      0
      1. djacidj > UnGnU Mensajes publicados 1468 Estado Colaborador
         
        ¡Gracias por su respuesta! ¿Podría mostrarme un ejemplo? Porque tengo bastantes dificultades con los scripts de Linux jaja

        ¡Gracias de antemano!
        0
  6. tuxboy Mensajes publicados 1083 Estado Miembro 190
     
    Hola,

    Solo para hacer una propuesta diferente, puedes probar esto:
    echo $(cal) | awk '{print $NF}'
    0