Befehl in if/else Verzweigung wird trotzdem ausgeführt

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
feldmaus
Beiträge: 1307
Registriert: 14.06.2005 23:13:22
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Deutschland

Befehl in if/else Verzweigung wird trotzdem ausgeführt

Beitrag von feldmaus » 26.09.2012 00:53:36

Guten Abend Alle, :-)

endlich mal wieder im Debian-Forum. :-) Ich habe LMDE mit Kernel 3.5.3 von Kernel.org. Und "GNU bash, Version 4.2.36(1)-release (i486-pc-linux-gnu)". Im folgenden Code wird trotz Korrekter Verzweigung der Code in meiner else-Verzweigung ausgeführt, obwohl dies bei mir zu Hause, wo mein Wlan-Interface einen 192.168.0.* Nummer erhält, nicht passieren sollte. Ich weiß nicht warum.

Code: Alles auswählen

#!/bin/bash

# /etc/network/if-up.d/startfirewalldsl --> /root/bin/startfirewalldsl

case "$LOGICAL" in
    ppp0)
	logger -p daemon.info "FW:(1) Starte die Firewall fuer logisches Interface $LOGICAL.";
	/root/bin/firewalldsl start ppp0
	;;
    lo)
	logger -p daemon.info "FW:(2) Starte NICHT die Firewall fuer logisches Interface $LOGICAL.";
	;;
    *)
	LANIP=`ip addr show dev $LOGICAL | sed -n -e 's/^\ *inet\ \([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}.[0-9]\{1,3\}\).*/\1/p'`
	if echo $LANIP | grep 192.168.[0-1].*; then 
	    logger -p daemon.info "FW:(3) Starte NICHT die Firewall fuer logisches Interface $LOGICAL.";
	else
	    logger -p daemon.info "FW:(4) Starte die Firewall fuer logisches Interface $LOGICAL.";
	    /root/bin/firewalldsl start $LOGICAL;
	fi
	;;
esac
Vor allen Dingen wird nur ein Teil in else ausgeführt. Dies ist erst seit meinem letzten großen Update am Wochende so. Davor ging es. Er führt bei mir zu Hause den then-Code aus und dann noch den else-Code, aber nicht den logger-Befehl im else-Code. Weiß Jemand ob das als Bug gemeldet wurde. Vor allen Dingen wundert mich, das <logger> kein zweites mal ausgeführt wird, wenn schon der else-Code ausgeführt wird.

Checkt dat Jemand?

Grüße Markus

EDIT: Hier nochmal der Code auf pastebin.com. Also er führt erst Zeile 16 und dann Zeile 19 aus. Zeile 18 wird nicht ausgeführt.

Benutzeravatar
feldmaus
Beiträge: 1307
Registriert: 14.06.2005 23:13:22
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Deutschland

Re: Befehl in if/else Verzweigung wird trotzdem ausgeführt

Beitrag von feldmaus » 26.09.2012 09:00:08

Ich bin mir nicht sicher ob ich das Problem selber lösen konnte, doch zur Zeit wird zumindest der Code in der else-Verzweigung (Zeile 18 und 19) nicht ausgeführt und zwar habe ich statt dieser Struktur

Code: Alles auswählen

if [CONDITION]; then
        COMMAND1
else
        COMMAND2
        COMMAND3
die folgende verwendet, welche funktioniert

Code: Alles auswählen

if [CONDITION]
then
        COMMAND1
else
        COMMAND2
        COMMAND3
Troztdem hätte COMMAND2 auch ausgeführt werden müssen, wenn COMMAND3 ausgeführt wird?! 8O

Grüße Markus

haber

Re: Befehl in if/else Verzweigung wird trotzdem ausgeführt

Beitrag von haber » 26.09.2012 10:42:24

Also ich sage jetzt mal was,auf die Gefahr hin dass ich zwar ausgelacht werde,aber ich sags trotzdem. :lol:
Hast Du schon versucht statt zu benutzen?
Andere Richtung:

Code: Alles auswählen

if [CONDITION]
then
        COMMAND1
else
        COMMAND2
        COMMAND3
Ändern in:

Code: Alles auswählen

if [CONDITION]
then
        COMMAND1
elif
        COMMAND2 && COMMAND3
fi
Allerdings heisst das dann,dass COMMAND3 erst ausgeführt wird,wenn COMMAND2 fehlerfrei durchgelaufen ist.


mfG. haber

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Befehl in if/else Verzweigung wird trotzdem ausgeführt

Beitrag von r900 » 26.09.2012 15:16:24

Also zuerst einmal schreibst du ein Skript in bash, du musst also nicht jede Zeile mit einem Semikolon abschließen wie in C. :wink:
feldmaus hat geschrieben:

Code: Alles auswählen

   if echo $LANIP | grep 192.168.[0-1].*; then 
Ein regulärer Ausdruck gehört immer in Apostrophe gesetzt, damit die shell keine Ersetzungen vornimmt. Außerdem hat der Punkt eine besondere Bedeutung, da er für ein beliebiges Zeichen steht. Also versuch es mal so:

Code: Alles auswählen

if echo $LANIP | grep -q '192\.168\.[0-1]\.[0-9]*' ; then 
Zu debug-Zwecken kannst du auch ein "set -x" zu Beginn deines Skriptes einfügen, dann siehst du genau welche Befehle ausgeführt werden.

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Befehl in if/else Verzweigung wird trotzdem ausgeführt

Beitrag von ThorstenS » 26.09.2012 16:48:37

und noch ein set -e dazu, dann bricht das Script bei jedem Fehler direkt ab.
-x und -e solltest du beim Entwickeln eines scriptes immer setzen.

Benutzeravatar
feldmaus
Beiträge: 1307
Registriert: 14.06.2005 23:13:22
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Deutschland

Re: Befehl in if/else Verzweigung wird trotzdem ausgeführt

Beitrag von feldmaus » 26.09.2012 20:57:31

ThorstenS hat geschrieben:und noch ein set -e dazu, dann bricht das Script bei jedem Fehler direkt ab.
-x und -e solltest du beim Entwickeln eines scriptes immer setzen.
Hi Thorsten, also Du meinst gleich in zweiter Zeile im Skript "set -x -e" eintragen?

Grüße Markus

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Befehl in if/else Verzweigung wird trotzdem ausgeführt

Beitrag von ThorstenS » 26.09.2012 22:07:21

exakt so mache ich es Markus.

Antworten