Hi
hab da ein kleines Problem mit einer IF THEN Abfrage
Eigentlicher habe ich eher ein Problem mit dem OR
Kann mir jemand sagen warum das nicht funktioniert bzw. wie es richtig funktiiniert?
Danke
Hi
hab da ein kleines Problem mit einer IF THEN Abfrage
Eigentlicher habe ich eher ein Problem mit dem OR
Kann mir jemand sagen warum das nicht funktioniert bzw. wie es richtig funktiiniert?
Danke
bash If ... or ... then ...? Schau mal ob du hier fündig wirst!
da steht, wenn ping dann tu x..
was soll der ping denn für ne antwort geben? da fehlt noch das ergebnis...
Wenn der Ping dann mach mach...
Funktioniert auch wunderbar mit einer IP ich muss aber Zwei abfragen daher die frage nach dem OR
nimm statt or
es geht um "oder" nicht.. "und"
in brackets kannst du das allerdings nicht nutzen..
da wäre zum beispiel folgendes passender
was bei der ganzen sache allerdings nicht bedacht wird, ist, dass der rückgabewert von ping hier falsch angenommen wird..
Das wird so aber trotzdem nicht gehen da ping in der Form nicht ausgeführt wird.
Das funktioniert nicht:
Erst das funktioniert:
Entweder
oder
(meine bevorzugte Schreibweise)
Desweiteren brauch man hier eigentlich keine doppelte Klammer ( [[ und ]] )
Und zu guter letzt ist der Punkt hier: /home/pi/raspberry-remote/./send
überflüssig da der vollständige Pfad angegeben wird
Wobei ein hab ich noch: Wenn die Einrückungen richtig wären, könnte man den Code auch besser lesen/entziffern/verstehen
die doppeklten klammern gehen auch nur in bash.. aber nich in sh.. was je nach verwendungszweck auch probleme bringen kann...
und wie gesagt.. das mit den exitcodes ist so eine sache,... ich würd folgendermaßen das ganze machen:
if [ `ping -c 1 $IP1 >> /dev/null;echo $?` -eq 0 ] || [ `ping -c 1 $IP2 >> /dev/null;echo $?` -eq 0 ]
ping produziert mehrere exitcodes.. gesucht wird aber nach "0".. was für "host reachable" steht..
Naja, ICH würde das völlig anders schreiben da das So allgemein eher unschön ist, aber egal
aber es funktioniert =)
ich bin kein coder.. aber da ich neugierig war, hab ich grad viel gegoogled und ausprobiert.. und das war das einzige was mich ans ziel führte =)
hier noch die andere schreibweise, welche meigrafd erwähnte.. (find ich im übrigen auch übersichtlicher)
Hi,
Hier könnte man auch einfach die Klammern komplett weglassen.
Um das ganze etwas übersichtlicher zu machen würde ich aber dennoch Klammern setzten und die ganze Ausgabe (dieser Kommandogruppe) ins /dev/null umleiten.
Und dann, wenn wirklich nötig einfach im nächsten Schritt den exit status auswerten. (Edit: Dazu müsste man dann aber doch den Exit Status der einzelnen ping Befehlen in einer Variable zwischenspeichern und dann einzeln auswerten. Das wäre mir viel zu aufwändig und ist hier auch nicht nötig.
Bist du dir auch sicher dass du ein ODER brauchst, und nicht doch ein UND?
Zur Erinnerung:
ODER bedeutet dass einer der beiden Hosts erreichbar sein muss damit der Ping erfolgreich ist, welcher das ist, ist dabei egal.
UND würde bedeuten dass beide erreichbar sein müssen.
)
Ersteinmal vielen Dank für die zahlreichen Antworten. Damit kann ich arbeiten
Die Programmiersprache ist mir leider völlig Fremd. Bin mehr auf dem .Net Sektor Zuhause, was zwar Ähnlichkeiten aufweist aber eben auch nicht wirklich vergleichbar ist.
Daher taste ich mich jetzt mal immer Stück für Stück voran ...
Ich weiß das es nicht sauber programmiert ist, aber wie schrieb einer bereits, es funktioniert
Ich werde das Programm letztendlich auch anders schreiben, boolscher Wert für die IP's
Sudo nur ausführen wenn IP= True und so weiter
Hintergrund des ganzen ist, dass wir nicht im dunklen Hausflur stehen wollen wenn wir Nachhause kommen.
Wenn Handy da dann ...
- Licht für drei Minuten ein -> dann aus
Warte bis der Status des Handy sich ändert ... uswusf
Ich würde das so machen:
ping -c1 -w1 hostname | grep " 0% packet loss" && (
tue_was_wenn_ping_erfolgreich, z.B. vara setzen und dann in if... then... else.. fi Schleife die Vara abfragen.
)
Ich sage schon mal sorry dafür, muss nicht schön sein sondern soll "nur" funktionieren =)
Kann es auch gerade nicht testen weil ich auf Arbeit nicht die Möglichkeit dazu habe.
Könnte das so funktionieren?
#!/bin/bash
#Licht war an = false
LWO=false
while true
do
# Wenn eine der beiden IP gepingt wird dann ...
if ping -c1 192.168.0.103 || ping -c1 192.168.0.104 ; then
# Host erreichbar
online=true
# war das Licht bereits eingeschaltet?
case $LWO in
true) online=false
;;
false) online=true
;;
esac
else
#Host nicht erreichbar & Licht war an = false
online=false
LWO=false
fi
if $online ; then
#Schalte das Licht ein. Licht war an auf =true
sudo /home/pi/raspberry-remote/./send 01010 1 1
LWO=true
#Schalte das Licht nach 2 Minuten aus
sleep 120
sudo /home/pi/raspberry-remote/./send 01010 1 0
else
#Frage alle 15 Sekunden den Onlinestatus ab
sleep 15
fi
done
Alles anzeigen
tom.angelripper hat es bereits angesprochen wie es eigentlich aussehen sollte, denn ein ping ansich reicht nicht, egal wie der Exitcode aussieht... Wichtig ist ob auch ein Ping zurück kommt
Zu diese Thema gabs hier aber schon mal irgendwo einen Thread mit einer ziemlich ähnlichen Idee (etwas einschalten wenn das Handy Abends im WLAN (oder wars später via Bluetooth?) erreichbar ist.. Leider weiß ich nicht mehr wie der Thread hieß, hab mittlerweile in zu vielen geholfen um mir alle zu merken
Zu deinem Script @ JT179: Du solltest dir mal eine übersichtlichere Schreibweise angewöhnen... Entweder nutzt man TABs zum Einrücken, oder zum Beispiel 2 bzw 4 Leerzeichen... Auch so viele Leerzeilen zerren das Script nur unnötig auseinander und machts unübersichtlich - gerade für uns Helfer is das echt Hardcore
Nur mal als Vergleich, Dein Script so wie Du es hier gepostet hast:
#!/bin/bash
#Licht war an = false
LWO=false
while true
do
# Wenn eine der beiden IP gepingt wird dann ...
if ping -c1 192.168.0.103 || ping -c1 192.168.0.104 ; then
# Host erreichbar
online=true
# war das Licht bereits eingeschaltet?
case $LWO in
true) online=false
;;
false) online=true
;;
esac
else
#Host nicht erreichbar & Licht war an = false
online=false
LWO=false
fi
if $online ; then
#Schalte das Licht ein. Licht war an auf =true
sudo /home/pi/raspberry-remote/./send 01010 1 1
LWO=true
#Schalte das Licht nach 2 Minuten aus
sleep 120
sudo /home/pi/raspberry-remote/./send 01010 1 0
else
#Frage alle 15 Sekunden den Onlinestatus ab
sleep 15
fi
done
Alles anzeigen
Und hier wie es eigentlich aussehen sollte:
#!/bin/bash
#Licht war an = false
LWO=false
while true; do
# Wenn eine der beiden IP gepingt wird dann ...
if ping -c1 192.168.0.103 || ping -c1 192.168.0.104 ; then
# Host erreichbar
online=true
# war das Licht bereits eingeschaltet?
case $LWO in
true) online=false ;;
false) online=true ;;
esac
else
#Host nicht erreichbar & Licht war an = false
online=false
LWO=false
fi
if $online ; then
#Schalte das Licht ein. Licht war an auf =true
sudo /home/pi/raspberry-remote/./send 01010 1 1
LWO=true
#Schalte das Licht nach 2 Minuten aus
sleep 120
sudo /home/pi/raspberry-remote/./send 01010 1 0
else
#Frage alle 15 Sekunden den Onlinestatus ab
sleep 15
fi
done
Alles anzeigen
Siehst du den Krassen Unterschied?
Man kann bei der unteren Schreibweise viel besser und eindeutiger erkennen welcher Code zu welchem Abschnitt bzw if Schleife gehört
Eigentlich sollte es auch egal sein ob du zuvor eine andere Programmiersprache gewohnt bist - eine gewisse Übersichtlichkeit sollte überall vorhanden und im eigenen Interesse sein
Noch mal zurück zur Funktionsweise des Scripts:
Zu 1. und 2.:
Eine entsprechender Befehl könnte wie folgt aussehen:
In einer if-Schleife also:
oder:
ist beides das selbe. -z prüft auf "leer". " ! " steht für NICHT. Kombiniert: wenn nicht leer. -n macht das selbe: wenn nicht leer .. Wenn also die Rückgabe des Befehls nicht leer ist trifft die if-Schleife zu und "then" wird ausgeführt
Zu 3.:
Ausserdem würde ich die Uhrzeit prüfen sowie speichern ob Abends auf das Handy bereits reagiert wurde.. Dafür bietet sich auch eine SQLite Datenbankdatei an damit der Status nach einem neustart des Scripts/PIs nicht verloren ist.
Zu 4.:
Überprüf das mal obs Handy im Standby über WLAN auch noch Pingbar ist.
Hi,
meigrafd, Du machst dir aber auch immer wieder eine Mühe. :thumbs1:
*An dieser Stelle einfach mal kurz ein zuwerf*
----------
Irgendwie stehe ich aber wohl gerade etwas auf dem Schlauch. :s
Wieso muss ich den output parsen um zu wissen dass der Ping erfolgreich ist?
Die einzige Möglichkeit dass Ping den Exit code 0 zurückgibt ist doch wenn der Ping auch erfolgreich ist, also ein Packet erfolgreich zurückgekommen ist.
Grüße,
Joh
Zitat
Noch mal zurück zur Funktionsweise des Scripts:
- Nur etwas anzupingen reicht nicht, man sollte auch prüfen ob ein Ping zurück kam
Zitat
ZitatEs wäre zu empfehlen auch einen Timeout im Ping-Befehl zu verwenden damit dieser nicht 10 Minuten sich quasi aufhängenderweise totläuft..
Zitat
ZitatWas ist wenn das ein mal durch gelaufen ist, was hindert es daran noch weitere male das Licht einzuschalten usw? Weil das Handy wird höchst wahrscheinlich auch weiterhin noch Pingbar sein oder nicht? Dein Handy ist zwar tagsüber nicht pingbar aber sobald du Abends nachhause kommst ist es die ganze Zeit pingbar... Oder was ist am nächsten Tag? Startest du das Script dann jeden Abend neu?
Du prüfst auch nicht vor dem " if $online; " ob beim 2.Durchlauf LWO an war, diese If Schleife wird dann immer und immer wieder ausgeführt.
Zitat
ZitatIst das Handy auch im WLAN wenn es im Standby ist? Wenn nein wäre es dann auch nicht pingbar - das war das Problem im anderen Thread weswegen der auf Bluetooth gewechselt hat...
Zitat
Hab ich gelesen, Bluetooth kommt für mich aber nicht in Frage da nicht immer eingeschaltet.
Zitat
Zu 1. und 2.:
Eine entsprechender Befehl könnte wie folgt aussehen:In einer if-Schleife also:
oder:
ist beides das selbe. -z prüft auf "leer". " ! " steht für NICHT. Kombiniert: wenn nicht leer. -n macht das selbe: wenn nicht leer .. Wenn also die Rückgabe des Befehls nicht leer ist trifft die if-Schleife zu und "then" wird ausgeführt
Schau ich mir mal an
Zitat
Zu 3.:
Ausserdem würde ich die Uhrzeit prüfen sowie speichern ob Abends auf das Handy bereits reagiert wurde.. Dafür bietet sich auch eine SQLite Datenbankdatei an damit der Status nach einem neustart des Scripts/PIs nicht verloren ist.
Ist mir zu aufwändig, ist nicht weiter schlimm wenn die Lampe mal 3 Minuten bei Helligkeit leuchtet.
Zitat
Zu 4.:
Überprüf das mal obs Handy im Standby über WLAN auch noch Pingbar ist.
Ist Andoid, also ja ist es
Ich sage erst einmal, vielen Dank
Das ist jetzt so viel Input das muss ich erst einmal selektieren
Werde aber auf jeden Fall das Resultat posten
Habt vielen Dank
LG
Timo
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!