Ответ 1
Подготовьте строку "10 #" в начало ваших переменных. Это заставляет bash рассматривать их как десятичные, хотя начальный ноль обычно делает их восьмеричными.
При запуске этой части моего bash script am появляется сообщение об ошибке
Script
value=0
for (( t=0; t <= 4; t++ ))
do
d1=${filedates[$t]}
d2=${filedates[$t+1]}
((diff_sec=d2-d1))
SEC=$diff_sec
compare=$((${SEC}/(60*60*24)))
value=$((value+compare))
done
Выход
jad.sh: line 28: ((: 10#2014-01-09: value too great for base (error token is "09")
jad.sh: line 30: /(60*60*24): syntax error: operand expected (error token is "/(60*60*24)")
d1 и d2 - это даты в этой форме 2014-01-09 и 2014-01-10
Любое решение, пожалуйста?
Подготовьте строку "10 #" в начало ваших переменных. Это заставляет bash рассматривать их как десятичные, хотя начальный ноль обычно делает их восьмеричными.
Что такое d1
и d2
? Являются ли они датами или секундами?
Как правило, эта ошибка возникает, если вы пытаетесь выполнить арифметику с номерами, содержащими нулевой префикс, например. 09.
Пример:
$ echo $((09+1))
-bash: 09: value too great for base (error token is "09")
Чтобы выполнить арифметику с 0-префиксными номерами, вам нужно указать bash использовать base-10, указав 10#
:
$ echo $((10#09+1))
10
d1 и d2 - это даты в этой форме 2014-01-09 и 2014-01-10
а затем
((diff_sec=d2-d1))
Что вы ожидаете получить? ((diffsec=2014-01-09-2014-01-10))
??
Вам нужно сначала преобразовать даты в секунды:
d1=$( date -d "${filedates[$t]}" +%s )
d2=$( date -d "${filedates[$t+1]}" +%s )
(( compare = (d2 - d1) / (60*60*24) ))
(( value += compare ))
Вам не нужны $
и {}
в выражении арифметическое расширение. Он должен выглядеть следующим образом:
compare=$((SEC/(60*60*24)))