2009-05-18 2 views
4

У меня запущен довольно простой скрипт bash в ubuntu, но у вас возникла проблема. При необходимости я отправлю весь сценарий, но я сузил проблему. В принципе, я хочу, чтобы запустить код каждые 15 секунд, так что я начал с этим:Bash script, Недопустимый номер: 08

time=`date +%S` 

time2=$((time%15)) 

if [ $time2 -eq 0 ] 

then 

и т.д., и т.д., и т.д ....

Проблема возникает, когда время 08 секунд. Сценарий завершается Нелегальная номер: 08. Добавление к этому, при использовании:

time2=$(($time%15)) 

вместо незаконной ошибки номер, он будет завершаться с арифметическим выражением: ожидается EOF: «08% 15»

Я предполагаю, что 08 не интерпретируется как число. Или есть какая-то базовая проблема, как будто она думает, что она в восьмеричном или что-то в этом роде. Любая помощь?

+2

08, вероятно, интерпретируется как восьмеричный в большинстве языков и систем C-стиля. – OregonGhost

+0

@OregonGhost: Действительно. И, более конкретно, 08 не является допустимым числом в восьмеричном, поэтому сообщение об ошибке. Для сравнения это эквивалентно подсчету в шестнадцатеричном виде и переход от 0x0F до 0x0G, т. Е. Вы не можете этого сделать ;-) –

ответ

4

Кратчайший решение:

time2=$((${time#0} % 15)) 

${var#glob} означает "$var с glob удалены с самого начала, если присутствует".

+0

Спасибо, это именно то, что я искал. – 2009-05-18 15:25:53

1

Поскольку вы заинтересованы только в «каждые пятнадцать секунд», а не работает вещи на минуту именно вы могли бы использовать date +%s (строчнымиs), который даст вам количество секунд с начала эпохи. У этого не будет ведущего 0, поэтому ваш скрипт должен работать нормально.

Однако, я бы задался вопросом о вашем коде в более широком контексте. Если система работает очень медленно по какой-то причине, возможно, сценарий может быть запущен второй 14, а затем второй 16 означает, что он пропустит выполнение.

Возможно, стоит прикоснуться к файлу, когда вы делаете то, что делает сценарий, а затем выполняете свое действие, когда последняя измененная дата файла составляет 15 или более секунд назад.

+0

Я знаю, что вы имеете в виду, некоторые секунды прыгают/игнорируются. Цель этого сценария, однако, состояла в том, чтобы просто проверить секунды, потому что я буду использовать это каждые 15 минут. Но мне, вероятно, придется проверить ваш ответ, потому что я не хочу, чтобы этот скрипт постоянно работал. – 2009-05-18 15:28:20

1

Это похоже на то, что оно интерпретирует его как восьмеричное.

Попробуйте date +%S | sed -e 's/^0//'

+0

Это тоже сработало. – 2009-05-18 15:31:07

4

Попробуйте использовать следующие флаги вместо

date +%-S 

Он говорит, учитывая -, он не будет подушечка. Он имеет проблемы с базой, интерпретируя его как восьмеричное целое число.

Во всяком случае, если вы хотите сделать что-то через каждые 15 секунд, я нахожу это один легче следовать:

while ((1)); do 
    echo do something now... 
    sleep 15s 
done 
+0

Спасибо, я учту это для будущей работы. – 2009-05-18 15:30:40

+0

Почему бы не использовать его для текущего скрипта? Он избавляется от проблемы элегантным способом (добавляет только один символ), указывая дату непосредственно на то, что вы хотите, вместо того, чтобы отбрасывать нуль после этого. –

+0

О, я буду, но не сразу. Когда я перехожу на минуты, я обязательно использую ваш код. – 2009-05-18 15:45:55

3

Force Bash не интерпретировать число в десятичной системе, независимо от того, сколько проложенных нулей:

time2=$((10#$time % 15)) 
2

Вы правы, это интерпретировало его как восьмеричное.Bourne оболочки делают, что для любого числа с ведущим 0 в арифметической Substition:

#~ $ echo $((010)) 
8 
#~ $ echo $((0100)) 
64 
#~ $ echo $((10#0100)) 
100 
#~ $ echo $((40#lolwut)) 
2213236429 

смотрите в странице Справочника «базовой #», чтобы увидеть все подробности об этом «# -forcing» вещи. вы можете получить довольно смешно с ним, если вы хотите

+0

Это то, что я искал thx, btw, чтобы вернуться от этого с помощью '40 # ': 34581? :) –

+1

Я думаю, что это делает то, что вы хотите: https://github.com/jrrs/sh/blob/master/lib/math/tobasen jrrs @ iorek: ~ $ ksh -c '. github/sh/lib/math/tobasen; tobasen -b 40 34581 ' lol – jrrs