我在ubuntu中运行一个非常简单的bash脚本但是遇到了问题。 如果需要,我会发布整个脚本,但我已经缩小了问题范围。 基本上,我想每15秒运行一些代码,所以我从这开始:
time=`date +%S`
time2=$((time%15))
if [ $time2 -eq 0 ]
then
等等等......
当时间为08秒时出现问题。该脚本以非法数字终止:08。 除此之外,使用时:
time2=$(($time%15))
而不是非法数字错误,它将以算术表达式终止:期待EOF:“08%15”
我猜测08不会被解释为数字。或者有一些基本问题,比如它认为它是八进制或其他东西。有什么帮助吗?
答案 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//'