Estoy escribiendo un script RSS del Horóscopo como introducción al proyecto Unix/Linux y me encontré con un problema que mi profesor no pudo solucionar en el tiempo que pude quedarme después de clase. Como no podía descubrir cómo usar fechas reales para verificar, pensé en probar la aritmética básica haciendo que la entrada del usuario fuera números estándar en formato MMDD. Según él, el script parece leer la entrada como código octal en lugar de un número entero. Aquí hay una muestra del guión:
elif [ "$olddate" -gt 1121 ] && [ "$olddate" -lt 1131 ] || [ "$olddate" -gt 1200 ] && [ "$olddate" -lt 1222 ]
then
echo "You are Sagittarius"
exit
elif [ "$olddate" -gt 1221 ] && [ "$olddate" -lt 1232 ] || [ "$olddate" -gt 0100 ] && [ "$olddate" -lt 0120 ]
then
echo "You are Capricorn"
exit
Esto es lo básico, saqué la parte RSS. "olddate" es la entrada esperada de mi mensaje de lectura. Mientras que de 1121 a 1131, de 1200 a 1222 y de 0100 a 0120 funcionan, nada entre 1221 y 1232 funciona. Supuso que ese era el problema, ya que poner 113 sin un 0 inicial funcionaba para Capricornio. También me encontré con un problema en el que 0323, que se suponía que me daría Aries (-gt 0320 && -lt 0332), me dio Acuario (cuyas fechas son -gt 0119 && -lt 0132 || -gt 0200 && -lt 0219) como además de que 0417 no funciona (que es el otro rango de fechas para Aries, -gt 0400 && -lt 0420).
¿Qué hago para que BASH interprete la entrada como los números reales? Intentó cambiar el mensaje de lectura para esperar "fecha de usuario" como entrada y luego agregar
olddate=`printf '%d\n' "$userdate"`
Pero eso no funcionó. ¡Gracias de antemano a cualquiera que pueda ayudarme con esto!
Respuesta1
Puedes forzar la conversión de un número a una base específica en bash así:
$ foo=400
$ echo $((8#$foo))
256
$ bar=0100
$ echo $((10#$bar))
100
En general el formato es $((base#value))
.