Bash脚本,非法数字:08

时间:2009-05-18 15:10:37

标签: bash

我在ubuntu中运行一个非常简单的bash脚本但是遇到了问题。 如果需要,我会发布整个脚本,但我已经缩小了问题范围。 基本上,我想每15秒运行一些代码,所以我从这开始:

time=`date +%S`

time2=$((time%15))

if [ $time2 -eq 0 ]

then
等等等......

当时间为08秒时出现问题。该脚本以非法数字终止:08。 除此之外,使用时:

time2=$(($time%15))

而不是非法数字错误,它将以算术表达式终止:期待EOF:“08%15”

我猜测08不会被解释为数字。或者有一些基本问题,比如它认为它是八进制或其他东西。有什么帮助吗?

6 个答案:

答案 0 :(得分:4)

最短的解决方案:

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

${var#glob}表示“$var glob从开头删除{{1}}”。

答案 1 :(得分:4)

尝试使用以下标志

date +%-S

它说-,它不会填充。它有基本问题,将其解释为八进制整数。

无论如何,如果你想每15秒做一次,我发现这个更容易理解:

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

答案 2 :(得分:3)

强制Bash以小数形式解释数字,无论填充多少零:

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

答案 3 :(得分:2)

你是对的,它把它解释为八进制。 bourne shell为算术替换中前导0的任何数字执行此操作:

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

查看'base#'的联机帮助页,查看有关此'#forcing'事项的所有详细信息。如果你想

,你会变得非常荒谬

答案 4 :(得分:1)

由于您只对“每十五秒钟”感兴趣而不是在某一分钟上运行,所以您可以使用{{1>}(小写 date +%s)从纪元开始以来的秒数。这将没有前导s,因此您的脚本应运行正常。

但是,我想知道你的代码在更广泛的背景下。如果由于某种原因系统运行速度非常慢,那么脚本可能只能在第二个14运行,然后在第二个16运行,这意味着它将错过执行。

当你执行脚本所做的任何操作然后在文件的最后修改日期是15秒或更长时间之前执行操作时,可能值得触摸文件。

答案 5 :(得分:1)

这看起来像是将它解释为八进制。

尝试date +%S | sed -e 's/^0//'