mehrzeiliges script mit "case" [gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
bongout
Beiträge: 217
Registriert: 15.08.2003 13:02:23
Kontaktdaten:

mehrzeiliges script mit "case" [gelöst]

Beitrag von bongout » 27.02.2006 21:51:26

Hi Forum,

für's internet networking hab ich folgendes Script gefunden:

Code: Alles auswählen

case ${OP} in
  start)
        $script start bridge=xen-br-adm netdev=eth1
        $script start bridge=xen-br-dmz netdev=dummy0
        $script start bridge=xen-br-pub netdev=eth0
        ;;
Dem Autor nach soll das für Debian sein - aber ich hab' das Problem, dass lediglich die erste Zeile ausgeführt wird.....

Warum?

Kann ich das sinnvoll mit

Code: Alles auswählen

case ${OP} in
  start)
        $script start bridge=xen-br-adm netdev=eth1&& \
        $script start bridge=xen-br-dmz netdev=dummy0 && \
        $script start bridge=xen-br-pub netdev=eth0
        ;;
lösen?
Zuletzt geändert von bongout am 28.02.2006 12:56:05, insgesamt 1-mal geändert.

jhr-online
Beiträge: 2186
Registriert: 18.09.2005 15:52:02
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Beitrag von jhr-online » 27.02.2006 22:56:11

Ich weiß nicht, was das Script soll, aber zum einen musst du natürlich die drei Network Devices auch haben (eth0, dummy0, eth1) und zum anderen sieht mir das irgendwie unvollständig aus. Mir fehlt da ein esac und ein #!/bin/bash, aber wie gesagt - ich weiß ja auch nicht, was das soll...

jhr
Desktop: Intel Core2Quad Q8300 2.5GHz, 256GB SSD + 1 TB HDD, 8 GB RAM, Debian Sid, Kernel 3.13

Methusalix

mehrzeiliges script mit "case"

Beitrag von Methusalix » 28.02.2006 01:33:06

Hallo,

was den zweiten Teil Deines Code-Abschnittes berifft, so kannst Du Dir den sparen. Er wird Dir nicht weiter helfen. Case prüft, ob eine von vielen Bedingungen zutrift und löst dann eine Aktion aus - z.B das Starten eines Netzwerkdevices. Das folgende (typische) Muster:

Code: Alles auswählen

case ${OP} in
  start) xyz
  stop) abc
   *) echo "helllau"
;;
esac
prüft, ob eine Bedingung zutriftt und gibt ansonsten hellau aus.
Siehe dazu u.a.

http://www.linuxfibel.de/bashprog.html

Gruß
Matthias

DeletedUserReAsG

Beitrag von DeletedUserReAsG » 28.02.2006 03:15:10

Bis auf das schon angesprochene esac und die shebang-Zeile ist das von der Bash aus gesehen so funktionsfähig. Ich würde den Fehler auch auf der rechten Seite suchen.

Als Einstieg zum Bash-Scripten ist imho http://www.tldp.org/LDP/Bash-Beginners-Guide/html/ gut geeignet.
cu

Benutzeravatar
bongout
Beiträge: 217
Registriert: 15.08.2003 13:02:23
Kontaktdaten:

Beitrag von bongout » 28.02.2006 12:05:12

Hi Folks,

danke und sorry für die ungenaue Frage....

Der code war nur ein Teil des ganzen... Auch mein Script (bin leider nicht zuhause) hat
case ${OP} in
start) xyz
stop) abc
*) echo "helllau"
;;
esac
Allerdings sehe ich zum einen, dass hier die ;; nach dem *) kommen - in meinem Script sind die ;; nach start, stop und *)

Is das ok?

Und die eigentliche Frage war, ob ich einfach drei Befehle in einer Option untereinander schreiben kann, damit sie ausgeführt werden oder muss ich sowas wie "&& \" ans Ende einer Zeile setzen?

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 28.02.2006 12:20:30

bongout hat geschrieben:
case ${OP} in
start) xyz
stop) abc
*) echo "helllau"
;;
esac
Allerdings sehe ich zum einen, dass hier die ;; nach dem *) kommen - in meinem Script sind die ;; nach start, stop und *)

Is das ok?

Und die eigentliche Frage war, ob ich einfach drei Befehle in einer Option untereinander schreiben kann, damit sie ausgeführt werden oder muss ich sowas wie "&& " ans Ende einer Zeile setzen?
Also, die beiden ;; sollten am Ende jedes Pattern-Blocks kommen. Wie in anderen Sprachen, wo du bei switch-case-Konstrukten ein break in jedem Block brauchst.
Zur anderen Sache: wenn die Befehle unabhaengig voneinander laufen sollen, dann ist das so, wie es im Skript ist ok. Das mit && dient dazu, dass Befehl2 nur ausgefuehrt wird, wenn Befehl1 erfolgreich gelaufen ist.

Benutzeravatar
bongout
Beiträge: 217
Registriert: 15.08.2003 13:02:23
Kontaktdaten:

Beitrag von bongout » 28.02.2006 12:53:37

Super, dann danke ich mal - auch wenn das bedeutet, dass irgendwas anderes faul ist, denn die zweite und dritte Zeile meines Script wird nicht ausgeführt... :-(

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 28.02.2006 13:52:22

Bist du dir da sicher?
Schon mal das

Code: Alles auswählen

set -x
eingebaut und dann getestet?

Benutzeravatar
bongout
Beiträge: 217
Registriert: 15.08.2003 13:02:23
Kontaktdaten:

Beitrag von bongout » 28.02.2006 19:03:21

Hi nepos,

danke für den Tipp mit set -x (man kann ja noch sooo viel lernen....)

Das script läuft jetzt einwandfrei durch... das Problem ist hier:

http://www.debianforum.de/forum/viewtopic.php?t=63308

Antworten