Escaping-Problem

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Der_Da_93, 29.06.2012.

  1. #1 Der_Da_93, 29.06.2012
    Zuletzt bearbeitet: 29.06.2012
    Der_Da_93

    Der_Da_93 irgendwie

    Dabei seit:
    01.06.2007
    Beiträge:
    152
    Zustimmungen:
    0
    Ort:
    127.0.0.1
    Hallo liebes Unixboard,
    Ich bin gerade dabei einen Home-Server dazu zu bringen selbständig nachts hochzufahren (um ihn Backups machen zu lassen) und ihn wieder runterfahren zu lassen.
    Das Hochfahren ist unter Debian mit rtcwake einfach zu lösen. Jetzt möchte ich aber, dass er nur dann runterfährt, wenn er auch via rtc gestartet wurde.

    Dafür habe ich mir überlegt, dass mein rtcwake-Script in eine Datei die geplante Aufwachzeit schreibt.
    Denn wenn jetzt das Backup fertig ist, sollte sich hiermit (Pseudo-Code) feststellen lassen, ob er via rtc gestartet wurde:
    Code:
    rtctime //aus der Datei
    uptime
    boottime = now-uptime; // Zeit zu der der Rechner gestartet wurde
    delta = |boottime-rtctime|
    if(delta < 3 min){
       //wurde also per rtc gestartet
    }
    
    Nun hab ich versucht das mit einem Bash-Script zu lösen:
    PHP:
    #!/bin/bash

    function startedByRTC() {
        
    rtctime=`cat rtcwake`; //die Datei
        
    now=`date +%s`;
        
    up=`awk '{print $1}' /proc/uptime`;
        
    up= $(echo "scale=0;$up/1"|bc); //runden
        
    boottime=`expr $now - $up`;
        
    delta= `expr $rtctime - $boottime`;
        if[`
    test $delta -lt 180` &&  `test $delta -gt -180`]
            
    then
                
    return $TRUE;
            else
                return 
    $FALSE;
        
    fi
    }
    Leider gibt's dabei ein Problem
    In der Zeile, in der ich versuche zu runden, wird das Semikolon als Befehlstrenner interpretiert, es kommt die Fehlermeldung "$up (also die Zahl von $up): Kommando nicht gefunden"
    Ich hab schon versucht mit "\" zu escapen, dafür bekomme ich dann "illegal character".

    Kann mir jemand helfen?


    P.S.: Ich bin ein absoluter bash-Anfänger und nehme auch andere Verbesserungsvorschläge gerne an.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Spröde, 30.06.2012
    Spröde

    Spröde Alter Sack

    Dabei seit:
    22.01.2012
    Beiträge:
    173
    Zustimmungen:
    0
    Bei mir funktioniert Deine Zeile, sobald ich das Leerzeichen zwischen up= und $( entferne:
    Code:
    up=$(echo "scale=0;$up/1"|bc); //runden
    Zur besseren Lesbarkeit würde ich bei Kommandosubstitutionen konsequent auf die Backticks `...` verzichten und nur $(...) benutzen. Ergibt das Selbe, liest sich aber besser. Deine Semikola an den Zeilenenden sind überflüssig.
     
  4. #3 Der_Da_93, 30.06.2012
    Der_Da_93

    Der_Da_93 irgendwie

    Dabei seit:
    01.06.2007
    Beiträge:
    152
    Zustimmungen:
    0
    Ort:
    127.0.0.1
    Hallo Spröde,
    Danke für deine Antwort. Leider hab ich festgestellt, dass der Fehler nicht zu dieser Zeile, sondern zu der eins darüber gehört.
    PHP:
    up= $(awk '{print $1}' /proc/uptime);
    Wenn ich die Zeile direkt eingebe, lautet der Fehler:
    Code:
    If '1901.61' is not a typo you can use command-not-found to lookup the package that contains it, like this:
        cnf 1901.61
    
    
     
  5. #4 HeadCrash, 30.06.2012
    HeadCrash

    HeadCrash Routinier

    Dabei seit:
    16.05.2009
    Beiträge:
    482
    Zustimmungen:
    1
    Ort:
    Bayern
    Auch hier gehört das Leerzeichen zwischen "up=" und "$(..." raus.
     
  6. #5 Spröde, 30.06.2012
    Spröde

    Spröde Alter Sack

    Dabei seit:
    22.01.2012
    Beiträge:
    173
    Zustimmungen:
    0
    Um Dir die Fehlerorgie zu ersparen, die Dir bevorsteht (z.B. werden Kommentare mit # eingeleitet), mal einen alternativen Code:
    Code:
    #!/bin/bash
    
    function startedByRTC() {
        rtctime=$( <rtcwake ) # die Datei
        up=$( </proc/uptime )
        up=${up//.*/} # abrunden, weil es einfacher ist - oder stoert das?
        boottime=$(( $( date +%s ) - $up ))
        delta=$(( $rtctime - $boottime ))
        if [ $delta -lt 180 -a $delta -gt -180 ]
            then
                return $TRUE
            else
                return $FALSE
        fi
    }
    
    Zur Programmlogik, kann ich natürlich nichts sagen.
     
  7. #6 Der_Da_93, 03.07.2012
    Der_Da_93

    Der_Da_93 irgendwie

    Dabei seit:
    01.06.2007
    Beiträge:
    152
    Zustimmungen:
    0
    Ort:
    127.0.0.1
    Vielen Dank,
    funktioniert ausgezeichnet.
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

Escaping-Problem