ubuntuusers.de

Endlosschleife in Bash

Status: Ungelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

kerrl

Avatar von kerrl

Anmeldungsdatum:
27. Januar 2009

Beiträge: 85

Hallo, ich bin ein Anfänger was die Shellprogrammierung angeht, finde mich eher in Java und C zurecht. Ich hab eben ein Skript angefangen. Es soll regelmäßig überprüfen, ob sich meine IP geändert hat.

Die Variablen scheinen nicht korrekt belegt zu sein. Wie muss das abgeändert werden?

#!/bin/bash

oldIP=$(w3m checkip.dyndns.org | grep IP|cut -c 21-)
echo oldIP: $oldIP
sleep 5

while true; do

	newIP=$(w3m checkip.dyndns.org | grep IP|cut -c 21-)
	echo newIP: $newIP	

	if [$oldIP -ne $newIP]
		then
		gdialog --msgbox "IP has changed!"
	fi

	oldIP=$newIP
	sleep 30
done

Wo ist da der Fehler? Schon der w3m-Aufruf schlägt fehl..

nullEuro

Avatar von nullEuro

Anmeldungsdatum:
26. Februar 2009

Beiträge: 225

Ein

man test

Verrät dir, dass

if [ $oldIP -ne $newIP ]

Nur für Integer Zahlen gilt, bei Strings musst du z.B. != als Operator nehmen:

if [ $oldIP != $newIP ]

Auserdem müssen nach und vor den eckigen Klammer Leerzeichen stehen!

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Hi kerrl,

zum abholen irgendwelcher Seiten nehme ich normalerweise wget, mit w3m habe ich keine Erfahrung.
Da musst Du selbst mal auf der Kommandozeile selbst probieren ...

Bekommst Du keine Fehlermeldung ?? - die ist sonst mit das wichtigste um Fehler zu finden.

Auf jeden Fall müsste diese Zeile einen Fehler werfen:

	if [$oldIP -ne $newIP]

... schau mal im Bash-Manual nach warum ... 😉

LG,

track

kerrl

(Themenstarter)
Avatar von kerrl

Anmeldungsdatum:
27. Januar 2009

Beiträge: 85

Zuerst hatte ich auch "!=" in gebrauch, habe es aber später zu "-ne" abgeändert.

Es ist bei mir genau anders herum, als ihr sagt: Es funktioniert nur mit "-ne"

moelledi

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 86

Moin kerrl!

Füge mal dem w3m die Option "-dump" hinzu, dann sieht die Welt schon anders aus.

Frohes Schaffen!

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

kerrl schrieb:

Zuerst hatte ich auch "!=" in gebrauch, habe es aber später zu "-ne" abgeändert.

... nun ja, ..?

Probier mal

	if ! [ "$oldIP" = "$newIP" ]

- das wäre sowohl POSIX- konform als auch resistent gegen leere Variablen. ☺

Aber vielleicht solltest Du doch mal im Bash-Manual nachlesen, bevor wir hier mit dem Skript-Raten weiter machen ?

LG,

track

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Übrigens:

1
cur_ip=$(curl http://www.whatismyip.org)

Erscheint mir so ganz generell am einfachsten für dieses Vorhaben. 😉 Liegt ja im Moment im Trend.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

... und es gab gerade gestern noch einen anderen Thread zu diesem Thema: http://forum.ubuntuusers.de/topic/ueberwachen-der-internetverbindung-auf-disconn/

Um überflüssigen Traffic zu vermeiden, plädiere ich noch immer dafür, nicht alle 30 Sekunden ins I'net zu klingeln, sondern lieber den Router abzufragen.

track

kerrl

(Themenstarter)
Avatar von kerrl

Anmeldungsdatum:
27. Januar 2009

Beiträge: 85

track schrieb:

Probier mal

	if ! [ "$oldIP" = "$newIP" ]

- das wäre sowohl POSIX- konform als auch resistent gegen leere Variablen. ☺

Damit bekomme ich diese Fehlermeldung in der Konsole:

./ip.sh: line 12: ![12.345.67.89: command not found

wobei da meine tatsächliche IP steht..

nullEuro

Avatar von nullEuro

Anmeldungsdatum:
26. Februar 2009

Beiträge: 225

Leerzeichen!

kerrl

(Themenstarter)
Avatar von kerrl

Anmeldungsdatum:
27. Januar 2009

Beiträge: 85

Die Fehlermeldung bleibt

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

kerrl schrieb:

Die Fehlermeldung bleibt

Nicht, wenn Du die Leerzeichen genau so setzt, wie von track geschrieben.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

... ähm, also ...

da erwartet die Shell das Schlüsselwort ! (ja, dieses eine Zeichen) und dann den Befehl [ (ja, auch dieses eine Zeichen ist ein Befehl, siehe man [ ) und danach einige Parameter. Und zwischen jedem von ihnen müsste ein Leerzeichen stehen, sonst weiß die arme Shell ja gar nicht wo was aufhört ...

Und dann fütterst Du sie mit einem ![12.345.67.89 - da weiß sie natürlich nicht was sie damit soll, denn den Befehl kennt sie ja nun wirklich nicht.

Hast Du denn mal einfach meinen Vorschlag markiert und mit Rechtsklick kopiert und in das Skript eingefügt ? - dann kämen die Leerzeichen ja mit.

Gibt es dann immer noch eine Fehlermeldung ?? - lass sie mal sehen !

track

kerrl

(Themenstarter)
Avatar von kerrl

Anmeldungsdatum:
27. Januar 2009

Beiträge: 85

Danke!

Ohne die Anführungszeichen klappt alles wie es soll.

Ich werd mir zudem mal anschauen, wie die Abfrage über den Router aussieht, um unnötigen Traffic zu sparen.

Grüße

BlackHollow

Anmeldungsdatum:
28. Juli 2009

Beiträge: 199

du kannst folgende Schreibweise verwenden

if [[ "$var_a" != "$var_b" ]]

und zu gdialog: (meine ich jedenfalls)

gdialog --msgbox "IP has changed\!"

anstelle von

gdialog --msgbox "IP has changed!"

Ich würde Dir raten die IP nicht von einem externen Server sondern direkt von deinem Router abzurufen. In meinem Fall funtioniert es folgendermaßen: (ist auch wesentlich schneller)

curl -s -u user: http://192.168.0.1/status.htm | sed -ne 132,132p | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'

In Zeile 132 steht meine externe IP ☺

// EDIT ... ein bisschen langsamer ... bezieht sich noch nicht auf den letzten Thread

Antworten |