kann Fehlermeldung nicht interpretieren

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo,
    ein Skript läuft bei mir zwischen 18.00 und 7.00 Uhr. Aber nur zwischenn 0.00 und 6.00 Uhr soll etwas geschehen.
    Das habe ich so gelöst:


    Allerdings bekomme ich im Log folgende Fehlermeldung:

    Code
    /home/pi/skripte/fhem/kontrolle.sh: Zeile 74: [[: 0019: Der Wert ist zu groß für die aktuelle Basis. (Fehlerverursachendes Zeichen ist \"0019\").


    Die IF-Anweisung steht in Zeile 74, der Fehlercode kann auch 0028 oder 0029 sein.
    Hab ich einen Denkfehler?

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

    Einmal editiert, zuletzt von docadams (25. Januar 2015 um 00:40)

  • Hi,
    nimm mal die doppelten eckigen Klammern raus ... also:

    Code
    if [ "$timeNow" -gt "$ALARMZEIT_EIN" ] && [ "$timeNow" -lt "$ALARMZEIT_AUS" ]; then


    statt:

    Code
    if [[ "$timeNow" -gt "$ALARMZEIT_EIN" ]] && [[ "$timeNow" -lt "$ALARMZEIT_AUS" ]]; then

    cu,
    -ds-

  • Die doppelten Eckklammern sorgen für ein Maskieren/Escapen. Das sollte man nur nutzen wenn mans wirklich benötigt.

    In diesem Fall ist es die Lösung des Problems :thumbs1: dreamshader hat also wiedermal Recht und diesmal war ich zu langsam :baeh2:

  • Hallo zusammen,

    docadams:
    timeNow wird in Deinem Beispiel immer grösser als "0000" sein, somit würde in diesem Fall genügen:

    Code
    if [ "$timeNow" -lt "$ALARMZEIT_AUS" ]; then
    ...
    fi

    Änderst Du aber
    ALARMZEIT_EIN="0000"
    z.B. in
    ALARMZEIT_EIN="2200"
    dann würde die mit UND verknüpfte Abfrage auch nicht funktionieren.

    Es müsste dann heissen:

    Code
    ALARMZEIT_EIN="2200"        
    ALARMZEIT_AUS="0559"
    ...
    timeNow=$(date +%H%M)
    if [ "$timeNow" -gt "$ALARMZEIT_EIN" ] || [ "$timeNow" -lt "$ALARMZEIT_AUS" ]; then
    ...
    fi

    Also mit ODER anstelle von UND verknüpfen!
    Das UND wäre allerdings richtig, wenn z.B. ALARMZEIT_EIN="0100".
    Alles nicht so einfach, wie man zunächst denkt. ;)

    Um es absolut flexibel zu halten, gäb's natürlich auch eine Lösung - mit einem anderen Ansatz. Aber Du wirst Deine Schaltzeiten vermutlich selten ändern müssen, dann passt es so durchaus.

    Ansonsten: lieber '-ge' statt '-gt' verwenden, bei '-lt' passt's ja bereits. ;)

    Gruß, mmi

  • Hammerhart: vier Leute diskutieren und keiner liest die Fehlermeldung.

    0019: Der Wert ist zu groß für die aktuelle Basis

    Die Shell interpretiert diesen Wert als Oktalzahl, und das geht
    nicht weil die Ziffer 9 im Oktalsystem nicht vorkommt !

    Egal wie er das if schreibt ...

    Einmal editiert, zuletzt von Tell (25. Januar 2015 um 08:12)

  • Tell: Hast dus ausprobiert? Offensichtlich nicht...

    Script aus erstem Beitrag: (nur timeNow fest auf 0019 uhr gesetzt)

    Vorgeschlagene Änderung vom 2.Beitrag:

    Wenn also das was Du meinst zutreffen würde, dürfte aber der 2.Code gar nicht funktionieren weil die Basis eigentlich weiterhin zu groß sein müsste :s

  • Hmm, das ist komplexer als ich dachte.

    Und jetzt seht Euch mal das an:

    Code
    timeNow=0019 
    x=$((timeNow+1))
    bash: 0019: Der Wert ist zu groß für die aktuelle Basis. (Fehlerverursachendes Zeichen ist \"0019\").
    
    
    timeNow=0017
    x=$((timeNow+1))
    echo $x
    16

    Und jetzt soll mir bitte einer einen Link geben, wo das Verhalten von
    [ und [[ genau definiert ist.

    Ich lerne ja gerne was dazu :D

  • Hallo Tell,

    Deine Beobachtung ist schon richtig;
    aber die Interpretation des Inhalts der Variablen ALARMZEIT_AUS als Oktalzahl durch die Shell scheint mir doch den doppelten square brackets des test statements geschuldet,
    welche durch einfache square brackets zu ersetzen, dreamshader und meigrafd bereits zu Beginn hingewiesen haben.

    Denn innerhalb doppelter square brackets wertet die Shell arithmetische Ausdrücke auch dahingehend aus,
    dass Zahlen mit führender 0 als Oktalzahlen interpretiert werden, während innerhalb einfacher square brackets anscheinend im Kontext des Ganzzahlvergleichsoperators -lt führende Nullen einfach gestrippt bzw. ignoriert werden.

    Somit war der empfohlene Übergang von doppelten zu einfachen square brackets schon die naheliegendste Lösung des Problems.

    Der Test funktioniert allerdings auch mit doppelten square brackets, wenn man die Shell die Variableninhalte lexikographisch (entsprechend der durch die Umgebung vorherrschenden Lokalisierung) sortieren lässt.
    Das scheint zu funktionieren, weil die < und > Vergleichsoperatoren einen String Kontext statt eines Integer Kontext wie bei -gt und -lt vorgeben.

    z.B.

    Code
    if  [[ $timeNow > $ALARMZEIT_EIN && $timeNow < $ALARMZEIT_AUS ]]; then

    Die single square bracket Variante des Test ist dem aber eindeutig vorzuziehen.

    Zitat


    timeNow=0019
    x=$((timeNow+1))
    bash: 0019: Der Wert ist zu groß für die aktuelle Basis. (Fehlerverursachendes Zeichen ist \"0019\").

    $((...)) bildet ebenfalls arithmetischen Kontext für das, was in den doppelten parens steht.
    Deshalb werden auch hier offenbar führende Nullen als Oktalzahlkennzeichner interpretiert.


    Und jetzt soll mir bitte einer einen Link geben, wo das Verhalten von
    [ und [[ genau definiert ist.

    Ich lerne ja gerne was dazu :D

    man bash

    Wenn man die Variablen, mit denen man Shell Arithmetik betreiben will, explizit deklariert,
    wirft die Shell bereits einen Fehler bei deren Zuweisung und nicht er bei deren Referenzierung.

    Code
    $ declare -i n=018
    bash: declare: 018: value too great for base (error token is "018")

    Man kann aber, um sicherzugehen, die Basis vorgeben.

    Code
    $ (declare -i n=10#017;echo $((++n)))
    18



    Wenn man die Variablen, mit denen man Shell Arithmetik betreiben will, explizit deklariert,
    wirft die Shell bereits einen Fehler bei deren Zuweisung und nicht erst bei deren Referenzierung.

    Code
    $ declare -i n=018
    bash: declare: 018: value too great for base (error token is "018")

    Man kann aber, um sicherzugehen, die Basis vorgeben.

    Code
    $ (declare -i n=10#017;echo $((++n)))
    18



    deliberately left blank owe to inadvertent double post

    @mods: könnt Ihr bitte meinen letzten redundanten Beitrag entfernen.
    Da ist mir anscheinend beim Posten etwas durcheinander geraten.

    Einmal editiert, zuletzt von Life_of_Pi (25. Januar 2015 um 15:14)

  • Zur Verwendung von ">" und "<" könnte man an dieser Stelle auch noch erwähnen dass wenn man keine doppelten brackets [[ ]] verwendet, diese unbedingt maskieren sollte, denn sonst werden die als Umleitung betrachtet und es werden Dateien in dem aktuellen Ordner angelegt :(

    Beispiel:



    @mods: könnt Ihr bitte meinen letzten redundanten Beitrag entfernen.
    Da ist mir anscheinend beim Posten etwas durcheinander geraten.

    Man kann seine eigenen Beiträge bearbeiten :fies:
    unten rechts vom Beitrag: postbit_edit.gif

  • Da finde ich Rundklammern doch praktischer:

    Code
    # (( 10 > 20 )) && echo jo
    # ls 20
    ls: Zugriff auf 20 nicht möglich: Datei oder Verzeichnis nicht gefunden
    #  (( 20 > 10 )) && echo jo
    jo
    #

    Ok, diese Möglichkeit gibt's ja noch nicht so lange - aber ich meine, damit kann man mögliche Fehler doch deutlich reduzieren, wie z.B. fehlender backslash, Hochkommas, etc.

    Wenn den ganzen Thread ein Einsteiger liest, ist die Verwirrung jetzt sicher perfekt. ;)

  • Zitat

    Wenn den ganzen Thread ein Einsteiger liest, ist die Verwirrung jetzt sicher perfekt. Icon_wink


    Naja, erst so ab der Mitte... Nein, das war ein Spaß.

    Vielen Dank für eure schnelle Hilfe. Ich kann mich gezwungenermaßen seit einigen Monaten nicht so intensiv um mein RasPi-Projekt kümmern und merke, wie schnell man wieder raus ist.
    Ich werde es heute Nacht mit nur einer Klammer testen. Und auch vielen Dank für die Hinweise und Zeile, wenn die Startzeit vor Null Uhr beginnt. Ich will diese sicherheitsrelevanten Dinge fest programmieren und nicht über eine Webseite deaktivieren können. Und wie schon richtig vermutet, werde ich nicht häufig, wenn überhaupt, da was ändern. Und wenn doch, habe ich die Zeile schon mal, man kann ja nie wissen...

    Wenn´s geklappt hat, wovon ich ausgehe, melde ich mich noch mal kurz.
    Ohne eure Hilfe würde ich vermutlich die Rollos immer noch hochkurben, also vielen Dank noch mal.

    PS. Ich hätte nicht gedacht, dass mein, für euch sicher billiges, Problem eine so tiefgreifende Fachdiskussion auslösen kann...

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!