2016-03-26 2 views
2

Я имею сценарий, чтобы определить день/ночь для RRDTool графов:Script ошибка: значение слишком велики для базы (маркер ошибки «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)) 

, который используется в RRDTool графах следующим образом:

#!/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: 

, а иногда (я не определен шаблон еще) я получить следующее сообщение об ошибке:

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 

Но это выглядит, что это происходит только около 23 часов.

Я нашел много решений, но я не могу применить один к моему сценарию.

ответ

1

Номера в bash с начальным нулем, как и во многих других языках программирования, интерпретируются как восьмеричные. Поэтому value too great for base как восьмеричные цифры только перейти от 0 до 7.

Решения сказать сценарий, что переменные SUNRISEHR, SUNRISEMIN и т.д. десятичные и не восьмеричные. Это может быть сделано, предваряя имя переменной 10# следующим образом:

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

Минимальный пример:

$ 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

решение так просто, если вы знаете, что вы делаете. Сейчас он работает как прелесть. И я понимаю это из-за вашего минимального примера. Большое спасибо. – RoSi

+0

Ou, он работал как прелесть в течение нескольких часов, но теперь теперь ** inc/sunlight.sh: строка 15: 10 # 1 * 3600 + 10 # 91 * 60: синтаксическая ошибка в выражении (маркер ошибки равен «1 * 3600 + 10 # 91 * 60 ") inc/sunlight.sh: строка 16: 10 # 1 * 3600 + 10 # 94 * 60: синтаксическая ошибка в выражении (токен ошибки« 1 * 3600 + 10 # 94 * 60 »)) ** ошибки. – RoSi

+0

Похоже, что есть место перед «1» в одной из ваших переменных. Чтобы удалить все пробелы из переменной в bash, вы можете сделать следующее: 'export A =" 1 "; echo "$ {A //}" ' – jbr