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