2016-03-26 21 views
2

I Skript Tag/Nacht für rrdtool grafische Darstellungen zu bestimmen habe:Script-Fehler: Wert zu groß für die Basis (Fehler-Token ist "09")

# Calculating Civil Twilight based on location from LAT LON 
DUSKHR=`/usr/bin/sunwait sun up $LAT $LON -p | sed -n '/Sun rises/{:a;n;/Nautical twilight/b;p;ba}' | cut -c 45-46` 
DUSKMIN=`/usr/bin/sunwait sun up $LAT $LON -p | sed -n '/Sun rises/{:a;n;/Nautical twilight/b;p;ba}' | cut -c 47-48` 
DAWNHR=`/usr/bin/sunwait sun up $LAT $LON -p | sed -n '/Sun rises/{:a;n;/Nautical twilight/b;p;ba}' | cut -c 30-31` 
DAWNMIN=`/usr/bin/sunwait sun up $LAT $LON -p | sed -n '/Sun rises/{:a;n;/Nautical twilight/b;p;ba}' | cut -c 32-33` 

# Calculating sunset/sunrise based on location from LAT LON 
SUNRISEHR=`/usr/bin/sunwait sun up $LAT $LON -p | sed -n '/Sun transits/{:a;n;/Civil twilight/b;p;ba}' | cut -c 30-31` 
SUNRISEMIN=`/usr/bin/sunwait sun up $LAT $LON -p | sed -n '/Sun transits/{:a;n;/Civil twilight/b;p;ba}' | cut -c 32-33` 
SUNSETHR=`/usr/bin/sunwait sun up $LAT $LON -p | sed -n '/Sun transits/{:a;n;/Civil twilight/b;p;ba}' | cut -c 45-46` 
SUNSETMIN=`/usr/bin/sunwait sun up $LAT $LON -p | sed -n '/Sun transits/{:a;n;/Civil twilight/b;p;ba}' | cut -c 47-48` 

# Converting to seconds 
SUNR=$(($SUNRISEHR * 3600 + $SUNRISEMIN * 60)) 
SUNS=$(($SUNSETHR * 3600 + $SUNSETMIN * 60)) 
DUSK=$(($DUSKHR * 3600 + $DUSKMIN * 60)) 
DAWN=$(($DAWNHR * 3600 + $DAWNMIN * 60)) 

, die in rrdtool Graphen wird wie folgt verwendet:

#!/bin/bash 
. inc/colors.sh 
. inc/sunlight.sh 

# Inside last 24 hours (mobile) 
rrdtool graph /ram/temperature/graphs/sensors-24h-inside-mobile.png \ 
--alt-autoscale \ 
--slope-mode \ 
--width 638 --height 337 \ 
--border 0 \ 
--font AXIS:13:0 \ 
--color BACK#363636 --color CANVAS#363636 --color GRID#999999 --color MGRID#B5B5B5 --color FONT#CCCCCC \ 
--x-grid MINUTE:60:HOUR:1:MINUTE:360:0:%R \ 
--y-grid 1:1 \ 
DEF:Obyvacka=ds_temperature.rrd:O:AVERAGE \ 
CDEF:nightplus=LTIME,86400,%,$SUNR,LT,INF,LTIME,86400,%,$SUNS,GT,INF,UNKN,Obyvacka,*,IF,IF \ 
CDEF:nightminus=LTIME,86400,%,$SUNR,LT,NEGINF,LTIME,86400,%,$SUNS,GT,NEGINF,UNKN,Obyvacka,*,IF,IF \ 
AREA:nightplus#303030 AREA:nightminus#303030 \ 
CDEF:dusktilldawn=LTIME,86400,%,$DAWN,LT,INF,LTIME,86400,%,$DUSK,GT,INF,UNKN,Obyvacka,*,IF,IF \ 
CDEF:dawntilldusk=LTIME,86400,%,$DAWN,LT,NEGINF,LTIME,86400,%,$DUSK,GT,NEGINF,UNKN,Obyvacka,*,IF,IF \ 
AREA:dusktilldawn#222222 AREA:dawntilldusk#222222 \ 
LINE2:Obyvacka$GREEN: 

und manchmal (ich habe kein Muster noch nicht bestimmt) ich werde folgende Fehlermeldung erhalten:

inc/sunlight.sh: line 15: 18 * 3600 + 09: value too great for base (error token is "09") 
ERROR: invalid rpn expression in: LTIME,86400,%,19920,LT,INF,LTIME,86400,%,,GT,INF,UNKN,Obyvacka,*,IF,IF 

Aber es sieht, dass Es passiert nur um 23 Stunden.

Ich habe viele Lösungen gefunden, aber ich kann nicht einzeln auf mein Skript anwenden.

Antwort

1

Zahlen in bash mit einer führenden Null werden wie in vielen anderen Programmiersprachen als oktal interpretiert. Daraus ergibt sich die value too great for base, als Oktalziffern gehen nur von 0 bis 7

Die Lösung ist Ihr Skript zu sagen, dass die Variablen SUNRISEHR, SUNRISEMIN etc sind dezimal und nicht Oktal. Dies kann durch das Vorsetzen der Variablennamen mit 10# erfolgen, wie folgt:

SUNR=$((10#$SUNRISEHR * 3600 + 10#$SUNRISEMIN * 60)) 
SUNS=$((10#$SUNSETHR * 3600 + 10#$SUNSETMIN * 60)) 
DUSK=$((10#$DUSKHR * 3600 + 10#$DUSKMIN * 60)) 
DAWN=$((10#$DAWNHR * 3600 + 10#$DAWNMIN * 60)) 

Minimal Beispiel:

$ export A=09; echo $(($A+1)) 
bash: 09: value too great for base (error token is "09") 

$ export A=09; echo $((10#$A+1)) 
10 
+0

Lösung so einfach, wenn Sie wissen, was Sie tun. Es wirkt jetzt wie ein Zauber. Und ich verstehe es wegen Ihres minimalen Beispiels. Vielen Dank. – RoSi

+0

Ou, es funktionierte für einige Stunden als ein Charme, aber jetzt bekommen ** inc/sunlight.sh: Zeile 15: 10 # 1 * 3600 + 10 # 91 * 60: Syntaxfehler im Ausdruck (Fehler Token ist "1 * 3600 + 10 # 91 * 60 ") inc/sunlight.sh: Zeile 16: 10 # 1 * 3600 + 10 # 94 * 60: Syntaxfehler im Ausdruck (Fehler Token ist" 1 * 3600 + 10 # 94 * 60 ") ** Fehler. – RoSi

+0

Sieht so aus als ob in einer Ihrer Variablen ein Leerzeichen vor der '1' steht. Um alle Leerzeichen aus einer Variablen in bash zu entfernen, können Sie folgendes tun: 'export A =" 1 "; echo "$ {A //}" ' – jbr