Blackhold

Controlar la longitud del mes

Posted on novembre 2nd, 2010 by admin

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

This entry was posted on dimarts, novembre 2nd, 2010 at 11:25 and is filed under bash. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

24 Responses to “Controlar la longitud del mes”

sabuesonovembre 3rd, 2010 at 02:40

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.

Blackholdnovembre 3rd, 2010 at 09:05

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…

sabuesonovembre 3rd, 2010 at 11:07

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.

Blackholdnovembre 3rd, 2010 at 11:11

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!

jluisnovembre 3rd, 2010 at 18:21

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

jluisnovembre 3rd, 2010 at 18:21

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

jluisnovembre 4th, 2010 at 10:32

$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/’ `

Blackholdnovembre 4th, 2010 at 10:45

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.

Blackholdnovembre 4th, 2010 at 10:45

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.

sabuesonovembre 4th, 2010 at 12:10

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
——————————————————

sabuesonovembre 4th, 2010 at 12:11

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.

jluisnovembre 4th, 2010 at 13:46

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

Ignacionovembre 7th, 2010 at 02:22

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.

Blackholdnovembre 7th, 2010 at 17:28

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 :)

emifebrer 20th, 2011 at 13:34

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);
}

emifebrer 20th, 2011 at 13:37

Fe de erratas:

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

Leave a Response

« »

guy fawkes