Comment empêcher Bash d'interpréter du code octal au lieu d'un entier?


13

J'écris un script RSS Horoscope en tant qu'introduction au projet Unix / Linux et j'ai rencontré un problème que mon professeur n'a pas pu résoudre pendant le temps que j'ai pu rester après les cours. Comme je ne pouvais pas comprendre comment utiliser les dates réelles comme éléments à vérifier, j'ai pensé essayer l'arithmétique de base en demandant aux utilisateurs de saisir des nombres standard au format MMDD. Selon lui, le script semble lire l'entrée en tant que code octal au lieu d'un entier. Voici un exemple du script:

    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

Ce sont les os nus, j'ai sorti la partie RSS. "olddate" est l'entrée attendue de mon invite de lecture. Alors que 1121 à 1131, 1200 à 1222 et 0100 à 0120 fonctionnent, rien entre 1221 et 1232 ne fonctionne. Il a pensé que c'était le problème depuis que mettre 113 sans un 0 de tête travaillait pour Capricorn. Je viens également de rencontrer un problème où 0323 qui était censé me donner le Bélier (-gt 0320 && -lt 0332) m'a donné Verseau (dont les dates sont -gt 0119 && -lt 0132 || -gt 0200 && -lt 0219) comme ainsi que 0417 ne fonctionne pas (qui est l'autre plage de dates pour le Bélier, -gt 0400 && -lt 0420).

Que dois-je faire pour que BASH interprète l'entrée comme les nombres réels? Il a essayé de changer l'invite de lecture pour s'attendre à "userdate" en entrée, puis en ajoutant

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

Mais ça n'a pas marché. Merci d'avance à tous ceux qui peuvent m'aider!


Impossible de dupliquer sur bash 4.4.12.
Ignacio Vazquez-Abrams

1
$ olddate est une chaîne, pas un nombre, donc utilisez des comparaisons de chaînes et évitez tout le bordel.
Stephen Harris

2
@StephenHarris: Il en va de même pour les valeurs à droite des opérateurs. C'est pourquoi testa des opérateurs numériques explicites.
Ignacio Vazquez-Abrams

Une chose à noter, mais sans rapport avec la question centrale, est que votre signe du zodiaque dépend également en partie de l'année de votre naissance, si votre jour et votre mois de naissance étaient proches de la transition entre 2 signes du zodiaque. Votre signe du zodiaque est basé sur la 1 / 12ème partie du ciel dans laquelle le soleil était au moment de votre naissance, mais parce que le nombre de jours dans une année n'est pas un nombre entier ni divisible par 12, il y a une certaine variation de année après année. Cette variation est trop complexe pour être réellement capturée dans les arbres if-else, mais c'est juste quelque chose qui pourrait être bon à savoir.
Nzall

Réponses:


28

Vous pouvez forcer la conversion d'un nombre en une base spécifique dans bash comme ceci:

$ foo=400
$ echo $((8#$foo))
256
$ bar=0100
$ echo $((10#$bar))
100

En général, le format est $((base#value)).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.