2009-05-18 18 views
4

私はubuntuでかなりシンプルなbashスクリプトを実行していますが、問題が発生しています。 必要に応じてスクリプト全体を投稿しますが、問題を絞り込んでいます。 は基本的に、私はいくつかのコード15秒ごとに実行したいので、私はこれで開始:時間は08秒であるときBashスクリプト、違法番号:08

time=`date +%S` 

time2=$((time%15)) 

if [ $time2 -eq 0 ] 

then 

など、など、など....

問題がアップします。使用して、とき08. それに追加::

ではなく、不正な数のエラーの
time2=$(($time%15)) 

、それは算術式で終了します:スクリプトが不正な番号で終了EOF期待:「08〜15%」

私は08が数字として解釈されないと推測しています。それとも、それが8進数であるか何かにあると思うような根本的な問題があります。どんな助け?

+2

08はほとんどのC言語の言語とシステムでは8進数として解釈される可能性が高いです。 – OregonGhost

+0

@OregonGhost:確かに。そして、より具体的には、08は8進数で有効な数字ではないため、エラーメッセージです。比較すると、それは16進数でカウントし0x0Fから0x0Gに行くことと同じです。つまり、あなたはそれを行うことができません;-) –

答えて

4

最短ソリューション:

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

${var#glob} "が存在する場合glob$varは初めから削除" を意味します。

+0

ありがとう、私が探していたものです。 –

1

するのではなく、正確にあなたがエポックの開始以来、あなたの秒数を与えるdate +%s小文字s)を使用することができます分で物事を実行するよりも、「15秒」でのみ興味があるので。これは先導0を持たないので、スクリプトはうまく動くはずです。

しかし、あなたのコードがより広い意味で不思議に思います。何らかの理由でシステムが非常に遅い場合は、スクリプトが2番目の14だけ実行され、次に2番目の16が実行されないことを意味する可能性があります。

スクリプトが何をしていても、ファイルの最後に変更された日付が15秒以上前になったらアクションを実行すると、ファイルに触れる価値があります。

+0

私はあなたが何を意味しているか知っています。しかし、このスクリプトの目的は、15分ごとにこれを使用するため、秒単位でテストすることだけでした。 しかし、私はこのスクリプトを絶えず実行したくないかもしれないので、あなたの答えをチェックしなければならないでしょう。 –

1

これは、それが8進数として解釈されているように見えます。

は代わりに

date +%-S 

を以下のフラグを使用してみてくださいdate +%S | sed -e 's/^0//'

+0

それも働いた。 –

4

を試してみてくださいそれは-を与えられ、それはパッドではないだろうと言います。それは8進整数としてそれを解釈するベースに問題があります。とにかく

、あなたが何かごとに15秒をしたい場合は、私は従うことがこの1つは簡単に見つける:

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

ありがとう、私は将来の仕事のためにそれを考慮に入れます。 –

+0

なぜこれを現在のスクリプトにも使用しないのはなぜですか?それは後でゼロを切り捨てるのではなく、あなたが望むものを直接日付に伝えるエレガントな方法(問題のある文字を追加する)で問題を取り除きます。 –

+0

ああ、私は、すぐにではありません。私が数分に変更すると、あなたのコードを間違いなく使用しています。 –

3

フォースバッシュどんなに多くのパッド入りのゼロ、小数点以下の数字を解釈しないために:

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

あなたはそうです、それはそれを8進数として解釈していました。この「#-forcing」の事についてのすべての詳細を参照するには「ベース#」のmanページで

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

見ます。Bourneシェルは、主要な算術Substitionで0と任意の数のことを行います。もしあなたが望むのであれば、かなりばかげてしまうかもしれません。

+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;トバセン-b 40 34581 ' 笑 – jrrs

関連する問題