Valeur trop grande pour la base (le jeton d’erreur est “0925”)

J’ai la logique suivante dans mon script bash:

#!/bin/bash local_time=$(date +%H%M) if (( ( local_time > 1430 && local_time  0300 && local_time < 0430 ) )); then # do something fi 

De temps en temps, j’obtiens l’erreur spécifiée dans le titre (tout moment au-dessus de 08xx semble déclencher l’erreur).

Des suggestions sur la façon de résoudre ce problème?

Je cours sur Ubuntu 10.04 LTS

[Modifier]

J’ai modifié le script comme suggéré par SiegeX, et maintenant je reçois l’erreur: [: 10#0910: integer expression expected .

De l’aide?

bash traite vos nombres comme octal à cause du zéro en tête

De l’ man bash

Les constantes avec un 0 sont interprétées comme des nombres octaux. Un 0 ou un 0 en tête indique hexadécimal. Sinon, les nombres prennent la forme [base #] n, où base est un nombre décimal compris entre 2 et 64 représentant la base arithmétique, et n est un nombre dans cette base. Si base # est omis, la base 10 est utilisée.

Pour le réparer, spécifiez le préfixe base-10

 #!/bin/bash local_time="10#$(date +%H%M)" if (( ( local_time > 1430 && local_time < 2230 ) || ( local_time > 0300 && local_time < 0430 ) )); then # do something fi 

Suivant les conseils de ce blog , cela fonctionne:

 #!/bin/bash local_time=`date +%H%M` local_time="$(( 10#$local_time ))" if (( ( local_time > 1430 && local_time < 2230 ) || ( local_time > 0300 && local_time < 0430 ) )); then echo "it is time!" fi 

Résoudre le problème dans le test conditionnel

On peut être obligé de conserver la variable telle quelle pour diverses raisons (par exemple, problèmes de dénomination de fichiers). Si tel est le cas, résolvez le problème dans le test conditionnel en spécifiant explicitement la base 10# :

 #!/bin/bash local_time=$(date +%H%M) if (( ( 10#${local_time} > 1430 && 10#${local_time} < 2230 ) || ( 10#${local_time} > 0300 && 10#${local_time} < 0430 ) )); then # do something fi