Gemeiner Fehler in einem Bash Script

Dieses wirklich einfache Script sollte simpel bei ungeraden Wochen abbrechen – nur an genau zwei Wochen des Jahres funktioniert das nicht. Findest du heraus warum?

Hier das Script:

#!/bin/bash

week=$(date +%V)
if [ $(($week % 2)) != 0 ]
then
   exit
fi

Lösung gibts weiter unten, erst rätseln dann spicken 🙂

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Lösung:

Das Script bringt an den Wochen 8 und 9 des Jahres den folgenden Fehler:

-bash: 09: value too great for base (error token is "09")

Der Grund:

date() gibt alle Datumswerte (auch die Woche) mit führenden 0en zurück. Bei der Ausgabe eines Datums ist das ja auch erwünscht und spart Arbeit.

Nur wenn man mit der Ausgabe rechnen will muss man wissen dass die Bash Zahlen mit führenden 0en als Oktal interpretiert.

Das macht die ersten 7 Wochen im Jahr nichts aus denn, oktal 1 bis 7 ist gleich dezimal 1 bis 7. Ab der 10. Woche fügt date() auch keine führende 0 mehr an und die Bash rechnet nun (wie erwartet) mit dem dezimalen System. Nur die Woche 08 und 09 sind im oktalen Zahlensystem nicht gültig. Deswegen wirft das Script einen Fehler!

Wer sich jetzt frägt warum dieser Beitrag in der Woche 9 des Jahres 2018 veröffentlicht wurde: Ja, uns ist dieser Fehler erst jetzt aufgefallen!

4 Antworten auf „Gemeiner Fehler in einem Bash Script“

  1. Moin,

    fieser Fehler, in den wäre ich wahrscheinlich auch rein gerannt. Ich musste gleich mal nachschlagen wie man das vermeidet und habe das hier aus der manpage ausgegraben:

    „`
    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 the optional 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.
    „`
    Alternativ kann man date korrekt bedienen: date +%-V

    Mir fiel dabei dann auf, dass o.g. script formal kein bash sondern ein sh script ist. In Bash würde man den Vergleich ordentlicherweise komplett arithmetisch machen machen:

    if (( week % 2 != 0 )); then
    exit
    fi

    Das spart den unnötigen Aufruf von [

    Viele Grüße

    Bernd

    1. Hallo Bernd,

      vielen Dank für die Infos!

      Ja, ich hab mal
      date +%-V
      als Pull Request vorgeschlagen, hätt ich in den Beitrag noch reinschreiben sollen!

      Thomas

    1. Hallo Arne,

      danke für den Link. Gut möglich dass ich den auch gelesen hatte und mich nur nicht mehr dran erinnern konnte…

      Ich denke dafür sollten solche Blogs auch da sein und das würd ich auch gerne mit meinem Blog schaffen: Neugier und Erstaunen auslösen und interessantes Wissen vermitteln was nicht ganz dem normalen Standard entspricht!

      Thomas

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.