¿Cómo evito que Bash interprete el código octal en lugar del entero?

13

Estoy escribiendo una secuencia de comandos 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 momento en que pude quedarme después de la clase. Como no podía entender cómo usar las fechas reales como qué 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 estar leyendo la entrada como código octal en lugar de 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

Esta es la esencia, saqué la parte RSS. "olddate" es la entrada esperada de mi solicitud de lectura. Mientras 1121 a 1131, 1200 a 1222 y 0100 a 0120 funcionan, nada entre 1221 a 1232 funciona. Pensó que ese era el problema, ya que poner 113 sin un 0 inicial funcionó 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 así como 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 indicador de lectura para esperar "fecha de usuario" como entrada y luego agregó

olddate=`printf '%d\n' "$userdate"`

Pero eso no funcionó. Gracias de antemano a cualquiera que pueda ayudarme en esto.

Irre Levant
fuente
No se puede duplicar en bash 4.4.12.
Ignacio Vázquez-Abrams
1
$ olddate es una cadena, no un número, así que use comparaciones de cadenas y evite todo el desorden.
Stephen Harris el
2
@StephenHarris: también lo son los valores a la derecha de los operadores. Es por eso que testtiene operadores numéricos explícitos.
Ignacio Vazquez-Abrams
Una cosa a tener en cuenta, pero no relacionada con la pregunta central, es que su signo del zodiaco también depende en parte del año en que nació, si su día y mes de nacimiento estuvieron cerca de la transición entre 2 signos del zodiaco. Su signo del zodiaco se basa en la 1/12 parte del cielo en el que estaba el sol en el momento en que nació, pero debido a que el número de días en un año no es un número entero ni divisible por 12, hay alguna variación de año a año. Esta variación es demasiado compleja para capturar realmente en árboles if-else, pero es algo que podría ser bueno saber.
Nzall

Respuestas:

28

Puede 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)).

Ignacio Vazquez-Abrams
fuente