Bash: (( `date +%m` < 8 )) - gelöst

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
xcomm
Beiträge: 804
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Bash: (( `date +%m` < 8 )) - gelöst

Beitrag von xcomm » 31.08.2008 11:29:59

Hi Gemeinde,
bei

Code: Alles auswählen

if (( `date +%Y` < 2009  && `date +%m` < "08" )); then
kommt ein

Code: Alles auswählen

08: value too great for base (error token is "08")
weil es scheinbar von einem Oktalwert ausgeht.

Code: Alles auswählen

if (( `date +%Y` < 2009  && `date +%m | sed 's/0//g'` < "08" )); then
Tut, wie es soll, wenn die nicht Null dabei ist..

Ist die Erklärung mit der Oktalzahl richtig und wie macht Ihr das üblicherweise, eventuell eleganter, mit den Monaten und der Null?

Regards, xcomm
Zuletzt geändert von xcomm am 31.08.2008 19:08:55, insgesamt 1-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash: (( `date +%m` < 8 ))

Beitrag von Meillo » 31.08.2008 12:11:53

Funktioniert das:

Code: Alles auswählen

if (( `date +%Y` < 2009  && "`date +%m | sed 's/0//g'`" < "8" )); then
(Ein leeres Argument sollte gleich 0 sein.)

Oder die führende 0 dran lassen, aber in Anführungszeichen, wie es bei "08" ja auch funktioniert:

Code: Alles auswählen

if (( `date +%Y` < 2009  && "`date +%m`" < "08" )); then
(Wieso eigentlich "08" und nicht "8" oder 8?)

Sonst einfach `sed' geeignet nutzen:

Code: Alles auswählen

if (( `date +%Y` < 2009  && "`date +%m | sed 's/^0\(.\)/\1/'`" < "8" )); then
(btw: dein `sed'-Ausdruck war sowieso falsch, denn aus "10" würde "1" werden.)
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash: (( `date +%m` < 8 ))

Beitrag von Meillo » 31.08.2008 12:22:24

xcomm hat geschrieben: wie macht Ihr das üblicherweise, eventuell eleganter, mit den Monaten und der Null?
Das kommt auf das Problem an. (Was genau ist denn deines?)
Denn mit `find' z.B. kann man auch schon nach Alter auswählen, somit kann man sich solche Vergleiche manchmal ersparen.

Sonst (vermeide ich Bashism) und löse es in etwa so:

Code: Alles auswählen

if [ "`date +%Y`" -lt 2009 ] ; then
  if [ "`date +%m`" -lt 8 ] ; then
    ...
  fi
fi
Use ed once in a while!

Benutzeravatar
SubOptimal
Beiträge: 1709
Registriert: 10.01.2005 23:25:46
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: bei Frankfurt

Re: Bash: (( `date +%m` < 8 ))

Beitrag von SubOptimal » 31.08.2008 12:24:53

Hi,

das mit der Oktalzahl war schon richtig gedacht. Siehe auch man bash
Constants with a leading 0 are interpreted as octal numbers. A leading 0x or 0X denotes hexadecimal. Otherwise, numbers take the form [base#]n, where base is a decimal number between 2 and 64 representing the arithmetic base, and n is a number in that base. If base# is omitted, then base 10 is used. ...
Ich würd das so lösen:

Code: Alles auswählen

if [ `date +%Y` -lt 2009  -a  `date +%m` -lt 8 ]; then
die Sache mit sed ist nicht notwendig und erhöht nicht gerade die Lesbarkeit. ;-)

SubOptimal

Benutzeravatar
xcomm
Beiträge: 804
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Re: Bash: (( `date +%m` < 8 ))

Beitrag von xcomm » 31.08.2008 12:43:47

Hi Ihr,

danke für die vielen Antworten!

Das Problem war hauptsächlich das mir date den Monat mit vorangesteller Null ausgibt. Das Beste wäre natürlich, wenn das gleich dort zu vermeiden wäre.

Code: Alles auswählen

date +%m
 08
Danke für den Hinweis mit der 10!

Danke, xcomm

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: Bash: (( `date +%m` < 8 ))

Beitrag von GoKi » 31.08.2008 13:07:13

xcomm hat geschrieben:Das Problem war hauptsächlich das mir date den Monat mit vorangesteller Null ausgibt. Das Beste wäre natürlich, wenn das gleich dort zu vermeiden wäre.
Die GNU Version kann das.

Code: Alles auswählen

date +%-m
MfG GoKi
:wq

Benutzeravatar
xcomm
Beiträge: 804
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Re: Bash: (( `date +%m` < 8 ))

Beitrag von xcomm » 31.08.2008 19:08:33

Hi GoKi,

perfekt - vielen Dank! :-)

Regards, xcomm

Antworten