zählschleifen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
linux-tux
Beiträge: 400
Registriert: 07.04.2004 08:09:13
Wohnort: Klagenfurt
Kontaktdaten:

zählschleifen

Beitrag von linux-tux » 30.07.2004 17:57:47

tag leute!!!

ich habe mir ein kleines progrämmchen geschrieben, dass eine InfoBox ausgibt, wenn die akku-kapazität unter 7% ist.
das problem ist, dass die InfoBox immer wieder kommt (nur wenn die akku-kapazität unter 7% ist) sobald ich auf ok klicke!
ich möchte das so gestalten, dass diese InfoBox nur einmal kommt, aber trotzdem im hintergrund immer wieder die akku-kapazität abfragt.

progrämmchen:

Code: Alles auswählen

#!/bin/sh

while true

        do
                if [ $WERT6 -lt 7 ]; then
                        messageBox "battery empty"
                fi
        done

i habe es schon probiert, habe gedacht es könnte so funktionieren:

Code: Alles auswählen

#!/bin/sh

while true
    x =  0;
    while ( x < 1 )
        do
                [ $WERT6 -lt 7 ]; then
                        messageBox "battery empty"
                x++;
        done
so funktioniert das aber nicht ganz!!


kann mir da wer helfen???


mfg linux-tux

Benutzeravatar
iocus
Beiträge: 55
Registriert: 25.03.2004 19:49:54
Wohnort: (CH)

Beitrag von iocus » 30.07.2004 18:04:30

du hast das if...fi vergessen :D . Ausserdem würde ich noch ein sleep oder sowas einbauen, damit das Skript nicht zu viel CPU frisst.
(kenne mich mit bash leider nicht so aus)

/edit: wozu muss das Programm denn weiterlaufen, wenn es nichts mehr anzeigt?? Hab ich was falsch verstanden?
Zuletzt geändert von iocus am 30.07.2004 18:06:57, insgesamt 1-mal geändert.

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 30.07.2004 18:06:44

wenn es wirklich bash ist, dann klappt "x++" nicht..

verwende dann

let x=x+1

als befehl!


/edit: ähm auch "while (x<1)" geht bei der bash nicht..

while [ $x -lt 1 ]
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
linux-tux
Beiträge: 400
Registriert: 07.04.2004 08:09:13
Wohnort: Klagenfurt
Kontaktdaten:

Beitrag von linux-tux » 30.07.2004 18:11:50

also dann sollte das ganze so ausschauen:

Code: Alles auswählen

#!/bin/sh

while true
    while ( x < 1 )
        do
                if [ $WERT6 -lt 7 ]; then
                        messageBox "battery empty"
                fi
                let x=x+1
        done
ja nachdem der akku wieder geladen ist und das netzteil abstecke, soll er ja wieder weiter prüfen ob die akku-kapazität noch über 7% ist oder nicht.


mfg linux-tux

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 30.07.2004 18:19:23

ok.. nein.. dann wart mal... hmm... also

#!/bin/sh

x=0

while true
do

if [ $WERT6 -lt 7 ]
then
if [ $x -eq "0" ]
then
messageBox "battery empty"
x=1
fi
else
x=0
fi

done


/edit: hmm.. warum ist das jetzt nicht eingerückt? keine Ahnung.. beim schreiben wars noch eingerückt
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
iocus
Beiträge: 55
Registriert: 25.03.2004 19:49:54
Wohnort: (CH)

Beitrag von iocus » 30.07.2004 18:33:22

/edit: hmm.. warum ist das jetzt nicht eingerückt? keine Ahnung.. beim schreiben wars noch eingerückt
Du solltest sowas immer in Code-Tags schreiben:

Code: Alles auswählen

 [code] 
[/code]

Nochmal mein Vorschlag: irgendwo ein

Code: Alles auswählen

sleep 5
(od. auch mehr) einbauen

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 30.07.2004 18:36:43

ups... ja das sleep wollte ich noch einfügen...

aber wie das nunmal so ist.. man vergisst es doch wieder ;-)

also versuch ichs gleich mal

Code: Alles auswählen

 
#!/bin/sh

x=0

while true
do

    if [ $WERT6 -lt 7 ]
    then
           if [ $x -eq "0" ]
           then
                   messageBox "battery empty"
                   x=1
           fi
    else
           x=0
    fi

    sleep 5
done 
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
linux-tux
Beiträge: 400
Registriert: 07.04.2004 08:09:13
Wohnort: Klagenfurt
Kontaktdaten:

Beitrag von linux-tux » 30.07.2004 19:29:18

ja macht nix!ich vergesse auch öfters was :)

danke!

ja das programm funktioniert soweit. bekomme aber diese fehler meldung beim ausführen des pürogrammes:

Code: Alles auswählen

Runtime error (func=(main), adr=14): Divide by zero
(standard_in) 2: parse error
(standard_in) 2: parse error
(standard_in) 1: parse error
./batteryempty: line 47: [: -lt: unary operator expected

was kann man dagegen tun???


mfg linux-tux

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 30.07.2004 19:33:28

setze mal die 7 in Anführungsstrichen!!!!

Ist ein übliches Problem...
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
linux-tux
Beiträge: 400
Registriert: 07.04.2004 08:09:13
Wohnort: Klagenfurt
Kontaktdaten:

Beitrag von linux-tux » 30.07.2004 19:57:52

hilft nichts!!kommt noch immer das gleiche.

was könnte da noch sein??


mfg linux-tux

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 30.07.2004 20:04:06

hmmm.. was steht denn in der beschriebenen Zeile 47

am besten Poste mal zusätzlich die Datei wenn du kannst
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
iocus
Beiträge: 55
Registriert: 25.03.2004 19:49:54
Wohnort: (CH)

Beitrag von iocus » 30.07.2004 20:07:34

Woher kommt dieser "$WERT6"? (oder woher sollte er kommen?)
Bei mir kommt genau dieser Fehler wenn diese Variable nicht definiert ist.

Benutzeravatar
linux-tux
Beiträge: 400
Registriert: 07.04.2004 08:09:13
Wohnort: Klagenfurt
Kontaktdaten:

Beitrag von linux-tux » 30.07.2004 20:08:20

ok!

Code: Alles auswählen

zeile 47 = if [ $WERT6 -lt 7 ]
ganzes file

Code: Alles auswählen

WERT1=`cat /proc/acpi/battery/BAT0/state  | tr "\t" " " | tr -s " " | grep "remaining capacity" | cut -d " " -f 3`
WERT2=`cat /proc/acpi/battery/BAT0/state  | tr "\t" " " | tr -s " " | grep "present rate" | cut -d " " -f 3`
WERT3=`echo "scale=2 ; $WERT1 / $WERT2" | bc`
WERT4=`echo "scale=2 ; 60*$WERT3" | bc`
WERT5=`echo "scale=2 ; 100*$WERT4" | bc`
WERT6=`echo "scale=0 ; $WERT5 / 120" | bc`
#######################################
x=0
while true
do
    if [ $WERT6 -lt "7" ];     //Zeile 47
    then
           if [ $x -eq "0" ];
           then
                   messageBox "battery empty"
                   x=1
           fi
    else
           x=0
    fi
    sleep 5
done
mfg linux-tux

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 30.07.2004 20:17:27

setz mal sowohl

$WERT6

als auch

$x

in Anführungsstrichen!!
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
linux-tux
Beiträge: 400
Registriert: 07.04.2004 08:09:13
Wohnort: Klagenfurt
Kontaktdaten:

Beitrag von linux-tux » 30.07.2004 20:22:33

ist noch immer das gleiche. (gleiche fehlermeldung)

mfg linux-tux

Benutzeravatar
iocus
Beiträge: 55
Registriert: 25.03.2004 19:49:54
Wohnort: (CH)

Beitrag von iocus » 30.07.2004 20:25:34

Füge mal vor dieser Zeile 47 ein

Code: Alles auswählen

echo $WERT6
ein.

ähm, diese Zeilen mit WERT1-6, stehen die so in dem Skript? Dann werden doch diese Werte nur einmal berechnet!?

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 30.07.2004 20:30:58

guter einwurf...

die Berechnung müsste auch in die Endlosschleife

und teste mal das script indem du die erste Zeile mit "-x" erweiterst..

also:

#!/bin/sh -x
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
linux-tux
Beiträge: 400
Registriert: 07.04.2004 08:09:13
Wohnort: Klagenfurt
Kontaktdaten:

Beitrag von linux-tux » 30.07.2004 20:39:50

achja, stimmt ja!die muss ich auch noch in ein while (true) setzen!!danke!!!

er schreibt mir da den WERT6 her.


mfg linux-tux

Benutzeravatar
linux-tux
Beiträge: 400
Registriert: 07.04.2004 08:09:13
Wohnort: Klagenfurt
Kontaktdaten:

Beitrag von linux-tux » 30.07.2004 20:41:09

wenn ich das mit -x erweitere bekomme ich folgendes:

Code: Alles auswählen

++ cat /proc/acpi/battery/BAT0/state
++ tr '\t' ' '
++ tr -s ' '
++ grep 'remaining capacity'
++ cut -d ' ' -f 3
+ WERT1=1857
++ cat /proc/acpi/battery/BAT0/state
++ tr '\t' ' '
++ tr -s ' '
++ cut -d ' ' -f 3
++ grep 'present rate'
+ WERT2=0
++ echo 'scale=2 ; 1857 / 0'
++ bc
Runtime error (func=(main), adr=14): Divide by zero
+ WERT3=
++ echo 'scale=2 ; 60*'
++ bc
(standard_in) 2: parse error
+ WERT4=
++ echo 'scale=2 ; 100*'
++ bc
(standard_in) 2: parse error
+ WERT5=
++ echo 'scale=0 ;  / 120'
++ bc
(standard_in) 1: parse error
+ WERT6=
+ x=0
+ true
+ echo

+ '[' '' -lt 7 ']'
./batteryempty: line 33: [: : integer expression expected
+ x=0
+ sleep 5
+ true
+ echo
mfg linux-tux

schoenhd
Beiträge: 44
Registriert: 16.02.2004 13:47:10
Wohnort: Trier
Kontaktdaten:

Beitrag von schoenhd » 30.07.2004 20:48:42

also bei mir tut es der code - bis auf den befehl

Code: Alles auswählen

messageBox "battery empty"
und BAT1 anstat BAT0

den befehl messagebox kennt er nicht
Debian GNU/Linux Sarge
Kernel 2.6.6, XFree 4.3, Fvwm2
P4M 2,0 GHz, 512 MB, 30 GB, WLAN
Toshiba Satellite Pro 2100

Benutzeravatar
iocus
Beiträge: 55
Registriert: 25.03.2004 19:49:54
Wohnort: (CH)

Beitrag von iocus » 30.07.2004 20:54:57

Das Problem:
Bei der Berechnung von WERT2 erhält er 0 (aus welchen Gründen auch immer). Durch diesen Wert will er dividieren -> geht net! Deshalb erhalten WERT3 bis 6 keinen Wert (d.h. einen leeren string). Und man kann nicht gut gar nichts mit 7 vergleichen (die Zeile mit -lt )

Also musst du dafür sorgen dass WERT2 nicht 0 wird (das soll es wohl auch nicht)

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 30.07.2004 21:14:47

so.. iocus hat vollkommen recht..

also überprüfe vorher ob das richtig ist.. mit dem Wert 0..

wenn ja, dann verhindere durch eine vorherige "if" Abfrage den Wert und schreibe dann zur Not manuell einen gültigen Wert in WERT6 damit -lt keinen Fehler bringt
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
linux-tux
Beiträge: 400
Registriert: 07.04.2004 08:09:13
Wohnort: Klagenfurt
Kontaktdaten:

Beitrag von linux-tux » 31.07.2004 08:04:49

ja danke leute! habe den fehler schon gefunden! ich habe nämlich das netzteil angesteckt gehabt und der akku war vollständig geladen und deshalb waren die werte 0.

jetzt funktioniert alles!danke!!!!!

fertiges programm:

Code: Alles auswählen

#!/bin/sh

x="0"
while true
WERT1=`cat /proc/acpi/battery/BAT0/state  | tr "\t" " " | tr -s " " | grep "remaining capacity" | cut -d " " -f 3`
WERT2=`cat /proc/acpi/battery/BAT0/state  | tr "\t" " " | tr -s " " | grep "present rate" | cut -d " " -f 3`
WERT3=`echo "scale=2 ; $WERT1 / $WERT2" | bc`
WERT4=`echo "scale=2 ; 60*$WERT3" | bc`
WERT5=`echo "scale=2 ; 100*$WERT4" | bc`
WERT6=`echo "scale=0 ; $WERT5 / 120" | bc`

        do
                if [ "$WERT6" -lt "7" ]; then
                        if [ "$x" -eq "0" ]; then
                                messageBox "battery empty"
                                x="1"
                        fi
                else
                        x="0"
                fi
                sleep 10
        done

messageBox ist ein eigenes Programm das ich auch geschrieben habe. das öffnet einfach nur einer InfoBox

Programm:

Code: Alles auswählen

#!/bin/bash


if test -z `dcop|grep kio_uiserver`; then
    kio_uiserver
fi

JOB_ID=`dcop kio_uiserver UIServer newJob 0 0`
dcop kio_uiserver UIServer messageBox  $JOB_ID 5 "$1" Information a b > /dev/null
dcop kio_uiserver UIServer jobFinished $JOB_ID
mfg linux-tux

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 31.07.2004 11:25:49

linux-tux hat geschrieben:messageBox ist ein eigenes Programm das ich auch geschrieben habe. das öffnet einfach nur einer InfoBox
Dafür gibt es doch zenity und co

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 31.07.2004 17:23:39

Oder kdialog...

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

Antworten