2009-05-18 8 views
4

Ich habe ein ziemlich einfaches Bash-Skript in Ubuntu ausgeführt, aber habe ein Problem gefunden. Bei Bedarf werde ich das ganze Skript posten, aber ich habe das Problem eingegrenzt. Grundsätzlich möchte ich einige Code alle 15 Sekunden laufen, also begann ich mit diesem:Bash-Skript, Ungültige Nummer: 08

time=`date +%S` 

time2=$((time%15)) 

if [ $time2 -eq 0 ] 

then 

etc, etc, etc ....

Das Problem kommt, wenn die Zeit 08 Sekunden ist. Das Skript endet mit Illegal Nummer: 08. das Hinzufügen, bei der Verwendung von:

time2=$(($time%15)) 

anstelle der illegalen Anzahl Fehler wäre es mit arithmetischem Ausdruck beenden: erwartete EOF: "08% 15"

Ich schätze, 08 wird nicht als eine Zahl interpretiert. Oder es gibt ein Grundproblem, wie es denkt, dass es oktal oder so ist. Irgendeine Hilfe?

+2

08 wird wahrscheinlich als oktal in den meisten C-Stil Sprachen und Systeme interpretiert. – OregonGhost

+0

@OregonGhost: In der Tat. Und genauer gesagt ist 08 keine gültige Zahl in Oktal, daher die Fehlermeldung. Im Vergleich dazu ist das gleichbedeutend mit dem Zählen in Hex und dem Übergang von 0x0F zu 0x0G, d. H. Du kannst das nicht ;-) –

Antwort

4

Shortest Lösung:

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

${var#glob} bedeutet "$var mit glob vom Anfang entfernt, falls vorhanden".

+0

Danke, das war genau das was ich gesucht habe. –

1

Da Sie nur daran interessiert, „alle 15 Sekunden“ sind nicht die Dinge auf der Minute laufen genau konnte man date +%s (Kleins) verwendet werden, die die Anzahl der Sekunden seit Beginn der Epoche geben. Dies wird keine führende 0 haben, damit Ihr Skript gut laufen sollte.

Allerdings würde ich über Ihren Code in einem breiteren Kontext fragen. Wenn das System aus irgendeinem Grund sehr langsam läuft, könnte es möglich sein, dass das Skript nur als zweites 14 und dann als zweites 16 ausgeführt wird, was bedeutet, dass es eine Ausführung verpassen wird.

Es könnte sich lohnen, eine Datei zu berühren, wenn Sie tun, was auch immer das Skript tut, und dann Ihre Aktion ausführen, wenn das Datum der letzten Änderung vor 15 oder mehr Sekunden liegt.

+0

Ich weiß, was du meinst, einige Sekunden werden übersprungen/ignoriert. Der Zweck dieses Skripts war jedoch nur, um mit Sekunden zu testen, weil ich das alle 15 Minuten benutze. Aber ich werde wahrscheinlich Ihre Antwort überprüfen müssen, weil ich nicht möchte, dass dieses Skript ständig ausgeführt wird. –

1

Das sieht so aus, als interpretiere es es als oktal.

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

+0

Das hat auch funktioniert. –

4

Versuchen Sie, die folgenden Flags anstelle

date +%-S 

Es sagt der - gegeben verwenden, ist es nicht Pad. Es hat Probleme mit der Basis und interpretiert es als eine oktale Ganzzahl.

Wie auch immer, wenn Sie etwas alle 15 Sekunden tun wollen, ich finde das eine leichter zu folgen:

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

Danke, ich werde das für die zukünftige Arbeit berücksichtigen. –

+0

Warum verwenden Sie es nicht auch für das aktuelle Skript? Es wird das Problem auf eine elegante Art und Weise beseitigt (nur ein Char) und das Datum direkt angeben, was Sie wollen, anstatt die Null danach wegzuschnippen. –

+0

Oh, werde ich, aber nicht sofort. Wenn ich zu Minuten wechsel, verwende ich Ihren Code. –

3

Force-Bash die Anzahl in dezimal zu interpretieren, egal wie viele gepolsterte Nullen:

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

Sie haben Recht, es wurde als oktal interpretiert.bourne Schalen tun, dass für jede Zahl mit einer führenden 0 in einer arithmetischen Substitution:

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

Blick in der Man-Page für ‚base #‘, um alle Informationen zu dieser ‚# -forcing‘ Sache zu sehen. Sie können ziemlich lächerlich damit, wenn Sie wollen

+0

das ist, was ich suchte thx, übrigens, eine Möglichkeit, von diesem mit '40 # 'zurück: 34581? :) –

+1

Ich denke, das tut, was Sie wollen: 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

Verwandte Themen