Controlar la longitud del mes

Aquí dejo un trozo de un script que me ha estado dando algunos problemas, el motivo era que necesitaba saber la longitud del mes, pero como estoy haciendo una operación matemática el 0 de los meses de 1 digito desaparece y es preciso volverlo a meter.

El script petaba porque wl wc -m contaba 3 carácteres en el echo “10”. El motivo es que esta expresión en realidad es echo “10n”, para sacar el n ponemos -n en el echo.

#/bin/bash

MONTH=$(date +%m)
YEAR=$(date +%Y)

((MONTH=${MONTH}-1))

echo $MONTH

LONG_MES=`echo -n ${MONTH} |wc -m`

echo $LONG_MES

if [ $LONG_MES -ne 2 ]; then
   MONTH="0${MONTH}"
fi

echo $MONTH

DATE=${YEAR}${MONTH}

echo $DATE

24 Comments

  1. Blackhold, te presento a printf(1).

    Dado que ya estamos en noviembre:

    printf “%02un” $(($(date +%m)-2))

    Respon
  2. Que conste que no hablo con Ignacio hace meses…

    -levanta un interprete de Python , ipython o python
    -escribe “from datetime import date”
    -ahora pon “print len(str(date.today().month))”

    Y se feliz (x un momento) ya que puedes contar la longitud de 2 caracteres sin necesidad de wc (siempre te encuentras con hijos de puta que borran binarios y hacen que los scripts fallen y tu quedes como una cutre)
    Despues de un pequeño suspiro y un pensamiento desencadena de “estoy queriendo aprender arquitectura para despues poner a aprender a jugar con Legos(tm)”, sigue con tus tareas habituales.

    Respon
  3. ya fui “feliz” durante unas horas cuando me dijeron, instala django y ponlo en marcha, lo instalé, hasta aquí bien, pero luego al ponerlo en marcha, la persona que me había recomendado usar django se me fue de birras… traté de rascar un par de horas, pero la cosa ahí se quedó y también de fui de birras por gracia :D…

    Respon
  4. Tienes un cacao importante, C, C++ , Django , estas esquivando Python? Perl te ha traumado en otra vida?
    Dejate de vueltas y pilla Python , que veras que le sacas jugo de sobra y es facil.
    Django te vendra solito cuando tengas un par de horas libres y sepas algo de Python.

    Respon
  5. anda que plastas sois los desarrolladores… ahora que tengo claro lo que voy a hacer tsst… no me lies xD si voy a tirar por openframeworks es porque quiero hacer cosas con él.
    Ya me pondré con lo demás cuando sea el momento ahora hay demasiados frentes abiertos!

    Respon
  6. A mi lo que mas me ha llamado la atención es el uso de dos procesos (echo , wc) y un pipe cuando uno ([) es suficiente.
    Ademas falta toda la logica para que month retenga un valor valido

    Respon
  7. A mi lo que mas me ha llamado la atención es el uso de dos procesos (echo , wc) y un pipe cuando uno ([) es suficiente.
    Ademas falta toda la logica para que month retenga un valor valido

    Respon
  8. $MONTH vale 0..11

    yo para formatearlo usaria una regex que tiene la ventaja de funcionar aunque el contenido sea este formateado
    MONTH=`echo -n 0$MONTH |sed -e’s/.*(..)$/1/’ `

    Respon
  9. toma ya xD

    aclaración ${MONTH} inicialmente te lo devuelve con 2 carácteres pero al hacer la operación matemática se come el 0 para esto tengo que comprobar la longitud de ${MONTH} porque luego esto lo uso como parte de nombre del script.

    Respon
  10. toma ya xD

    aclaración ${MONTH} inicialmente te lo devuelve con 2 carácteres pero al hacer la operación matemática se come el 0 para esto tengo que comprobar la longitud de ${MONTH} porque luego esto lo uso como parte de nombre del script.

    Respon
  11. Os mola rascaros la oreja izquierda con la mano derecha, anda que no me estoy divirtiendo con este post…
    ——————————————————
    #!/usr/bin/env python

    from datetime import date

    #esto es para que no tengas ni que leer si quieres obtener el mes actual
    #print len(str(date.today().month))

    #mes=str(date.today().month)
    mes=”2″

    if len(mes) == 2:
    print “salen 2 numericos,asi que nada”
    else:
    print “salen 1 , por ende nos le metemos un 0 delante”
    print “0”+mes
    ——————————————————

    Respon
  12. Si se te da por tener un lustro de lucidez y pruebas python , recuerda que es un lenguaje indentado, asi que si hace copi-enganxao del texto y no le pones los tabs correspondientes no te funcionara.

    Respon
  13. Lo que no me habia dado cuenta es que hay una solucion mas limpia en bash

    MONTH=0$MONTH;MONTH=${MONTH: -2}

    Yo no tengo nada contra python (prefiero perl) pero si usa bash puede que sea porque no pueda usar otro sistema de guionado

    Respon
  14. Bueno, aquí se han discutido cantidad de cosas:

    Yo hablaba sobre el tema de dar formato a variables, caso para el que lo mejor es no crear las cadenas a mano, sino usar funciones de formato propias del lenguaje (printf en bash, “%s” % variable en python, etc…)

    Ramiro recomendaba python como lenguaje bastante universal (suerte si tienes que tocar AIX… aunque suerte también si estás acostumbrado a bash) y medianamente lógico. Y que para aprender a programar es mejor no empezar la casa por el tejado y si quieres pegarte con C, C++ adelante. Recuerdos a malloc de mi parte y a Segmentation Fault.

    jluis no se de que hablaba exactamente, me ha perdido bastante.

    Y xD… pues lo suscribo al 1000%. Con la salvedad de que si por cualquier cosa tienes que hacer una operación distinta, esa aproximación puede no ser práctica (por ejemplo, efectuar acciones cada dos o tres meses mediante una operación módulo). En cuyo caso printf FTW.

    Y con esto y un bizcocho, cada día estoy más chocho.

    Respon
  15. si si, si lo de plastas ya tenía razón una servidora ;)

    ha estado muy bien, estos artículos con tantos comentarios son los que molan porque en gnu/linux hay mil formas para hacer lo mismo (no cómo en windows que como mucho hay 4 xD).

    gracias a todos :)

    Respon
  16. Ignacio, te mando recuerdos de malloc, realloc y free. Me han dicho q te echan de menos y yo, me los encuentro a diario. Por cierto, si en bash quieres hacer una operación matemática (cómo módulo), basta con $(( 23 % 7 )), que te da 2.

    Blackhold, pasa de todos y aprende C/C++. Es la base del resto de lenguajes (todos o casi todos). Si aprendes esto, el resto de lenguajes están mamaos: te aparecerán preguntas como ¿y como reservo memoria en PHP (por poner un ejemplo)? ¿y como la libero? Y, al final, programarás en PHP mejor que quien empezó directamente con este.

    Solo para el regocijo de los presentes y para dar la forma 1001:

    #include
    #include

    void main void()
    {
    time_t
    ahora = time(NULL);
    struct tm
    Ahora = *localtime(&ahora);

    /* El mes ya va de 0 a 12 */
    printf(“%04d%02dn”, Ahora.tm_year, Ahora.tm_month);
    }

    Respon
  17. Fe de erratas:

    * Los meses van de 0 a 11: evidentemente, no existe el 13º mes.
    * Ahora.tm_month = Ahora.tm_mon

    Respon

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.