Discussion:
"date +%V": Kalenderwoche ohne führende Null
(zu alt für eine Antwort)
Wolfgang Klein
2016-02-22 21:35:07 UTC
Permalink
Moin!

Mitte letzten Jahres habe ich in einem Script diese Anweisungen eingebaut:

kw=$(date +%V)
ungerade=$((kw % 2))

"Damals" waren die Wochennummer bereits zweistellig, daher ist es mir
nicht aufgefallen, aber jetzt bekomme ich folgende Fehlermeldung:

ungerade=$((kw % 2))
bash: 08: Der Wert ist für die aktuelle Basis zu groß.
(Fehlerverursachendes Zeichen ist »08«).


Dagegen funktioniert die Berechnung tadellos, wenn ich

kw=$(date --date="today +10 weeks" +%V)
ungerade=$((kw % 2))
echo $ungerade
0

oder

kw=$(date --date="today +11 weeks" +%V)
ungerade=$((kw % 2))
echo $ungerade
1

ausführe. Wie kriege ich kriege ich die führende Null weg?




Wolfgang
Torsten Fleischmann
2016-02-22 21:56:21 UTC
Permalink
Post by Wolfgang Klein
kw=$(date +%V)
ungerade=$((kw % 2))
"Damals" waren die Wochennummer bereits zweistellig, daher ist es mir
ungerade=$((kw % 2))
bash: 08: Der Wert ist für die aktuelle Basis zu groß.
(Fehlerverursachendes Zeichen ist »08«).
Zwei Lösungen...
1. Nimm die ZSH ;)
2. ungerade=$((${kw#0} % 2))
--
Gruß,

Torsten
Helmut Waitzmann
2016-02-24 06:39:59 UTC
Permalink
[Wie bekommt man aus "$kw" die führende Null weg?]
Post by Torsten Fleischmann
2. ungerade=$((${kw#0} % 2))
"${kw#0}" funktioniert nur, wenn "$kw" nicht 0 ist und höchstens 1
führende 0 hat. In diesem Fall dürfte das zutreffen.

Nur für den Hinterkopf, d.h. für allgemeinere Fälle mit beliebig
vielen führenden Nullen:

"${kw%%[!0]*}" lässt nur die führenden Nullen stehen.

Wenn man das von "$kw" vorne abschneidet, beginnt die Zahl, oder
das, was von ihr übrig ist, nicht mehr mit einer Null:

"${kw#"${kw%%[!0]*}"}" löst die Aufgabe, ausgenommen den
Sonderfall, dass "$kw" Null war: In diesem Fall bleibt nichts
übrig.

Beheben kann man den aber anschließend mit "${kw:=0}". Das steckt
in die Variable kw den Wert 0 rein, falls sie leer ist.

Zusammengenommen ergibt sich

kw="${kw#"${kw%%[!0]*}"}" && : "${kw:=0}"
Marcel Logen
2016-02-22 22:01:05 UTC
Permalink
Post by Wolfgang Klein
kw=$(date +%V)
ungerade=$((kw % 2))
"Damals" waren die Wochennummer bereits zweistellig, daher ist es mir
ungerade=$((kw % 2))
bash: 08: Der Wert ist für die aktuelle Basis zu groß.
(Fehlerverursachendes Zeichen ist »08«).
Aus der man page zur bash (die Du vermutlich verwendest):

| ARITHMETIC EVALUATION
| [...]
| Constants with a leading 0 are interpreted as octal numbers.

Oktalzahlen bestehen nur aus den Ziffern 0 bis 7: die 8
verursacht den Fehler. In der Woche 7 dürfte es noch ge-
klappt haben, vermute ich.
Post by Wolfgang Klein
Wie kriege ich kriege ich die führende Null weg?
Ob das mit bash-eigenen Mitteln geht, weiß ich jetzt nicht,
bei mir funktioniert das hier:

| $ echo 08
| 08
| $ echo 08 | bc
| 8
| $ date +%V | bc
| 8

Marcel
--
+---+ +-------+ +------+ +-------+ +----+ +
+----+ +---+ +----+ +----+ +-+ +----+ +--+ +-+
+ +-------+ +-----+ +-+ +-+ +-+ +-+ +---+ +--+ +---+
+----------+ +--+ +-+ +---+ +---+ +-+ +----+
Wolfgang Klein
2016-02-22 22:11:10 UTC
Permalink
Post by Marcel Logen
Oktalzahlen bestehen nur aus den Ziffern 0 bis 7: die 8
verursacht den Fehler. In der Woche 7 dürfte es noch ge-
klappt haben, vermute ich.
Stimmt, hast Recht: letzte Woche gab es noch keinen Fehler. Ist ja auch
heute der erste Tag in der 8. Kalenderwoche, also der erste Tag mit
Fehler. Erst, als Du es eben erwähntest, fiel es mir auch auf.
Post by Marcel Logen
Ob das mit bash-eigenen Mitteln geht, weiß ich jetzt nicht,
Ich vergaß zu erwähnen, daß das Skript auf OpenWRT läuft, dort wird die
Busybox-Version von "date" unter der BB-Version der "ash" benutzt. Daher
funktioniert

date +"%-V"

leider nicht.

Aber

kw=${kw#0}

funktioniert bestens!

Danke schön! :-)



Wolfgang
Heiko Berges
2016-02-23 13:38:52 UTC
Permalink
Post by Wolfgang Klein
kw=$(date +%V)
ungerade=$((kw % 2))
ausführe. Wie kriege ich kriege ich die führende Null weg?
Du kannst einer Konstanten eine Basis mitgeben:

ungerade=$(( 10#$kw % 2))


Heiko
J***@fokus.fraunhofer.de
2016-02-23 14:00:01 UTC
Permalink
Post by Heiko Berges
Post by Wolfgang Klein
kw=$(date +%V)
ungerade=$((kw % 2))
ausführe. Wie kriege ich kriege ich die führende Null weg?
ungerade=$(( 10#$kw % 2))
Steht das in POSIX oder ist das ksh Spezifisch?

Ich kann es in POSIX nicht finden.
--
EMail:***@schily.net (home) Jörg Schilling D-13353 Berlin
***@fokus.fraunhofer.de (work) Blog: http://schily.blogspot.com/
URL: http://cdrecord.org/private/ http://sourceforge.net/projects/schilytools/files/
Heiko Berges
2016-02-23 15:33:58 UTC
Permalink
Post by J***@fokus.fraunhofer.de
Post by Heiko Berges
Post by Wolfgang Klein
kw=$(date +%V)
ungerade=$((kw % 2))
ausführe. Wie kriege ich kriege ich die führende Null weg?
ungerade=$(( 10#$kw % 2))
Steht das in POSIX oder ist das ksh Spezifisch?
Weder noch. Das ist der Teil aus ksh, den bash erfolgreich
kopiert hat. ksh spezifisch wäre typeset -i10 kw, aber der
OP hatte ja nach bash gefragt.


Heiko
J***@fokus.fraunhofer.de
2016-02-23 15:38:33 UTC
Permalink
Post by Heiko Berges
Post by J***@fokus.fraunhofer.de
Post by Heiko Berges
ungerade=$(( 10#$kw % 2))
Steht das in POSIX oder ist das ksh Spezifisch?
Weder noch. Das ist der Teil aus ksh, den bash erfolgreich
kopiert hat. ksh spezifisch wäre typeset -i10 kw, aber der
OP hatte ja nach bash gefragt.
Also ksh hat ja einige wenige Dinge aus bash kopiert und 10#xxx
funktioniert auch in aktuellem ksh93
--
EMail:***@schily.net (home) Jörg Schilling D-13353 Berlin
***@fokus.fraunhofer.de (work) Blog: http://schily.blogspot.com/
URL: http://cdrecord.org/private/ http://sourceforge.net/projects/schilytools/files/
Christian Weisgerber
2016-02-23 15:34:35 UTC
Permalink
Post by J***@fokus.fraunhofer.de
Post by Heiko Berges
ungerade=$(( 10#$kw % 2))
Steht das in POSIX oder ist das ksh Spezifisch?
Letzteres.
Post by J***@fokus.fraunhofer.de
Ich kann es in POSIX nicht finden.
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04
"Only the decimal-constant, octal-constant, and hexadecimal-constant
constants specified in the ISO C standard, Section 6.4.4.1 are
required to be recognized as constants."
--
Christian "naddy" Weisgerber ***@mips.inka.de
J***@fokus.fraunhofer.de
2016-02-23 18:11:18 UTC
Permalink
Post by Christian Weisgerber
Post by J***@fokus.fraunhofer.de
Post by Heiko Berges
ungerade=$(( 10#$kw % 2))
Steht das in POSIX oder ist das ksh Spezifisch?
Letzteres.
Post by J***@fokus.fraunhofer.de
Ich kann es in POSIX nicht finden.
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04
"Only the decimal-constant, octal-constant, and hexadecimal-constant
constants specified in the ISO C standard, Section 6.4.4.1 are
required to be recognized as constants."
OK, genau weil ich nur das finden konnte habe ich nachgefragt.

Ich bin nämlich gerade dabei das letzte fehlende Feature für POSIX
Kompatibilität in den Bourne Shell einzubauen: $((expr)). Die Erweiterungen für
den Lexer (name.c) sind bereits fertig, nun fehlt noch der Interpreter in
macro.c.


Siehe auch: http://schilytools.sourceforge.net/bosh.html für die Liste der
bisherigen Änderungen.
--
EMail:***@schily.net (home) Jörg Schilling D-13353 Berlin
***@fokus.fraunhofer.de (work) Blog: http://schily.blogspot.com/
URL: http://cdrecord.org/private/ http://sourceforge.net/projects/schilytools/files/
Wolfgang Klein
2016-02-23 15:39:09 UTC
Permalink
Post by Heiko Berges
ungerade=$(( 10#$kw % 2))
Ja, das kenne ich, aber auch das funktioniert unter OpenWRT mit
(BusyBox) leider nicht.



Wolfgang
Thomas Noll
2016-02-23 18:31:57 UTC
Permalink
Post by Wolfgang Klein
Post by Heiko Berges
ungerade=$(( 10#$kw % 2))
Ja, das kenne ich, aber auch das funktioniert unter OpenWRT mit
(BusyBox) leider nicht.
Wie wäre es mit:

ungerade=$(( 1$kw % 2))
Wolfgang Klein
2016-02-24 12:53:10 UTC
Permalink
Post by Thomas Noll
ungerade=$(( 1$kw % 2))
Das ist ja richtig clever! :-)



Wolfgang

Sieghard Schicktanz
2016-02-23 19:52:53 UTC
Permalink
Hallo Wolfgang,
Post by Wolfgang Klein
kw=$(date +%V)
ungerade=$((kw % 2))
bash: 08: Der Wert ist für die aktuelle Basis zu groß.
(Fehlerverursachendes Zeichen ist »08«).
...
Post by Wolfgang Klein
ausführe. Wie kriege ich kriege ich die führende Null weg?
Schreib' 'ne 1 davor, das ändert die "Geradheit" der Zahl nicht. Also:

ungerade=$((1$kw % 2))

Die Variable braucht dann allerdings eine explizite Dereferenzierung ("$").
--
--
(Weitergabe von Adressdaten, Telefonnummern u.ä. ohne Zustimmung
nicht gestattet, ebenso Zusendung von Werbung oder ähnlichem)
-----------------------------------------------------------
Mit freundlichen Grüßen, S. Schicktanz
-----------------------------------------------------------
Loading...