Shellprogamming Ja/Nein frage.
Hallo Liste! Ich habe von jemanden einen Link bekommen wo ich Shellprogramming beispiele und Tutorials habe. Jetzt wollt ich auch grad mal ein kleines dummes tool schreiben, aber schon recht früh habe ich das erste große problem!! ich möchte über eine if schleife den benutzer fragen ob eine datei überschrieben werden soll oder nicht. bzw wird in dem script erst geprüft ob die datei schon existiert. wenn nicht mit wget vom server laden. ansonsten "datei existiert. soll überschrieben werden? Ja/Nein. Auf dieser seite stand nun das ich case benutzen soll somit sied mein quellcoude so aus: #!/bin/bash if [ ! -e /tmp/ordner/datei1.txt ]; then wget http://pfad.zum.server.de/pfad/zur/datei.txt ; else echo "Die Datei datei1.txt existiert bereits. Soll sie überschrieben werden?"; case $1 in Ja|Nein) response=1;; -[tT]) table=TRUE;; *) echo "Unbekannte Option"; exit 1;; esac while : do echo "Zum Beenden . eingeben ==> \c" read line # read: Zeile von StdIn einlesen case "$line" in .) echo "Ausgefuehrt" break;; *) echo "$line" >> $message ;; esac done wenn ich jetzt das programm starte bekomme ich folgende fehlermeldung: /home/mshmidt/Desktop/tessst: line 23: syntax error: unexpected end of file Was ist denn daran falsch? auf der seite die mir empfohlen wurde stand das so... bzw ab zeile case $1 in den teil habe ich kopiert und eingefügt. Wenn jemand noch andere seiten (am besten auf deutsch) kennt wo das shellscripting nähr gebracht wird wäre ich dankbar wenn ich einen link bekommen könnte.... Gruß Maurice
Am 16.08.06 schrieb Maurice Schmidt
if [ ! -e /tmp/ordner/datei1.txt ]; then
Wo ist das fi?
Wenn jemand noch andere seiten (am besten auf deutsch) kennt wo das shellscripting nähr gebracht wird wäre ich dankbar wenn ich einen link bekommen könnte....
man bash Gruß Martin
Am Mittwoch, 16. August 2006 23:01 schrieben Sie:
Am 16.08.06 schrieb Maurice Schmidt
: if [ ! -e /tmp/ordner/datei1.txt ]; then
Wo ist das fi? an welcher stelle denn??? nach dem done??? man bash war schon klar... aber ich suche eigendlich was wo es auf deutsch geschrieben steht wie das funzt mit beispielen zum ausprobieren...
Trotzdem danke Gruß Maurice
Maurice Schmidt, Donnerstag, 17. August 2006 00:21:
Am Mittwoch, 16. August 2006 23:01 schrieben Sie:
Am 16.08.06 schrieb Maurice Schmidt
: if [ ! -e /tmp/ordner/datei1.txt ]; then
Wo ist das fi?
an welcher stelle denn??? nach dem done???
if [ ! -e /tmp/ordner/datei1.txt ]; then wget http://pfad.zum.server.de/pfad/zur/datei.txt ; noch eine Anweisung ; noch eine Anweisung... ; fi -- Andre Tann
Am Donnerstag, 17. August 2006 07:46 schrieb Andre Tann:
if [ ! -e /tmp/ordner/datei1.txt ]; then wget http://pfad.zum.server.de/pfad/zur/datei.txt ; noch eine Anweisung ; noch eine Anweisung... ; fi ja das ist klar. pass auf hier nochmal mein vorhaben.
#!/bin/bash if [ ! -e /tmp/ordner/datei1.txt ]; then wget http://pfad.zum.server.de/pfad/zur/datei.txt ; else echo "Die Datei datei1.txt existiert bereits. Ueberschreiben?"; case $1 in Ja|Nein) response=1;; -[tT]) table=TRUE;; *) echo "Unbekannte Option"; exit 1;; esac while : do echo "Zum Beenden . eingeben ==> \c" read line case "$line" in .) echo "Ausgefuehrt" break;; *) echo "$line" >> $message ;; esac done fi wenn die datei nicht existiert wget ansonsten echo soll überschreiben ja nein warten auf eingabe von ja oder nein je nach eingabe weitere ausgaben wie ausgeführt oder unbekannte option .... oder wie auch immer.. ist der code der oben steht so richtig? kann ich mir nicht vorstellen, da das script beim ausführen folgendes ausgiebt. rechner:~# ./tessssst.sh Die Datei datei1.txt. existiert bereits. Ueberschreiben? Unbekannte Option rechner:~# Nach der ausgabe von Unbekannte Option wird das script abgebrochen. steht da ja auch exit 1; soll er auch... aber zu einer eingabe die ich am bildschirm machen soll kommt es gar nicht erst. von daher finde ich die Tutorial seite nicht sehr praktisch. schließlich stand das so dort und ich habe nur if [ ! -e /tmp/ordner/datei1.txt ]; then wget http://pfad.zum.server.de/pfad/zur/datei.txt ; else echo "Die Datei datei1.txt existiert bereits. Ueberschreiben?"; hinzugefügt.. also liegt schon der fehler im code des tutorials. oder bin ich jetzt vollkommen bescheu.. geworden :-/ Gruß Maurice
Maurice Schmidt schrieb:
Nach der ausgabe von Unbekannte Option wird das script abgebrochen. steht da ja auch exit 1; soll er auch... aber zu einer eingabe die ich am bildschirm machen soll kommt es gar nicht erst. von daher finde ich die Tutorial seite nicht sehr praktisch. schließlich stand das so dort und ich habe nur if [ ! -e /tmp/ordner/datei1.txt ]; then wget http://pfad.zum.server.de/pfad/zur/datei.txt ;
else echo "Die Datei datei1.txt existiert bereits. Ueberschreiben?"; hinzugefügt.. also liegt schon der fehler im code des tutorials. oder bin ich jetzt vollkommen bescheu.. geworden :-/
$ man read gruess raffael
Am Donnerstag, 17. August 2006 15:55 schrieb Maurice Schmidt:
ist der code der oben steht so richtig? kann ich mir nicht vorstellen,
Ich auch nicht. Ich verstehe auch nicht, wie der Code das erledigen soll, was Du vorhast. Vor allem: - $1 ist das erste Argument, welches Du dem Skript übergeben hast. - mir fehlt ein "break" Schau Dir das noch mal genauer an. Wenn Du die case Abfrage verstanden hast, kannst Du Dir sicher selbst erklären, warum sie sich wie beschrieben verhält. Und anschließend erklärst Du mir, was sie eigentlich tun sollte. Ich sehe nämlich den Zusammenhang zu Deinem Vorhaben nicht. Für das, was Du eigentlich vorhast, könnte Dir folgender Code helfen, den Du (wenn Du case verstanden hast) munter abwandeln kannst: #!/bin/bash while : do echo "Ja / Nein?" read line # read: Zeile von StdIn einlesen case "$line" in [jJ]|[jJ]a) echo "Ja wurde eingegeben" echo "Jetzt kann ich ganz viel tun..." break;; [nN]|[nN]ein) echo "Nein wurde eingegeben" echo "Jetzt kann ich was anderes tun" break;; *) echo "Du hast \"${line}\" eingegeben.";; esac done Gruß, Achim
Am Donnerstag, 17. August 2006 16:41 schrieb Achim Schäfer: [...]
- $1 ist das erste Argument, welches Du dem Skript übergeben hast. - mir fehlt ein "break" sorry aber ich fange grad erst mit solch einem progammieren an. hab zwar hier und da mal ein bischen was mit php gemacht aber auch wirklich nur die absoluten anfänge davon :-/
Schau Dir das noch mal genauer an. Wenn Du die case Abfrage verstanden hast, kannst Du Dir sicher selbst erklären, warum sie sich wie beschrieben verhält. Und anschließend erklärst Du mir, was sie eigentlich tun sollte. Ich sehe nämlich den Zusammenhang zu Deinem Vorhaben nicht. Also deine case zeilen sehen schonmal logischer aus wie auf der tutorial seite die ich gelesen habe. ich will erreichen: WENN /tmp/ordner/datei.txt Vorhanden ist DANN case FRAGE DEN BENUTZER OB DATEI ÜBERSCHREIBEN SOLL ODER NICHT bei ja/j/yes/y wget http://datei.aus.dem./internet.txt > /tmp/ordner/datei.txt esac ANSONSTEN download überspringen und nächsten befehle ausführen.
Für das, was Du eigentlich vorhast, könnte Dir folgender Code helfen, den Du (wenn Du case verstanden hast) munter abwandeln kannst: Jap so hab ich case "verstanden" aber guckst du hier: http://www.selflinux.org/selflinux/html/shellprogrammierung03.html#d139e3352 im unteren drittel bei "case-beispiel-fortgeschritten.sh" das habe ich nicht verstanden. davon mal abgesehen funzt nichtmal der code so. :-)
Super heißen Dank!!! Gruß Maurice
Hallo, Am Don, 17 Aug 2006, Maurice Schmidt schrieb: [..]
ich will erreichen: WENN /tmp/ordner/datei.txt Vorhanden ist DANN case FRAGE DEN BENUTZER OB DATEI ÜBERSCHREIBEN SOLL ODER NICHT bei ja/j/yes/y wget http://datei.aus.dem./internet.txt > /tmp/ordner/datei.txt esac ANSONSTEN download überspringen und nächsten befehle ausführen.
Aeh, deine Beschreibungen sind immernoch SEHR konfus.
Für das, was Du eigentlich vorhast, könnte Dir folgender Code helfen, den Du (wenn Du case verstanden hast) munter abwandeln kannst: Jap so hab ich case "verstanden" aber guckst du hier: http://www.selflinux.org/selflinux/html/shellprogrammierung03.html#d139e3352 im unteren drittel bei "case-beispiel-fortgeschritten.sh" das habe ich nicht verstanden. davon mal abgesehen funzt nichtmal der code so. :-)
Doch, natürlich funktioniert das Beispiel auf selflinux, aber natürlich nicht in deinem Fall, denn du willst ja was anderes machen. Du hast bisher nämlich nur irgendwelche Fragmente, die du irgendwo gefunden hast oder selber erdacht hast wild zusammengeklatscht. So geht das aber natürlich nicht. Lese bitte den _kompletten_ Abschnitt zu case auf selflinux. Das "fortgeschritten" Script dort macht genau 2 Dinge, die _nichts_ miteinander zu tun haben. Und auch mit dem was du machen willst nicht. Also, nun doch noch zu deinem Kram, den du oben uebrigens voellig unleserlich geschrieben hast.
WENN /tmp/ordner/datei.txt Vorhanden ist
if test -e /tmp/ordner/datei.txt
DANN
then
case FRAGE DEN BENUTZER OB DATEI ÜBERSCHREIBEN SOLL ODER NICHT
read -p "Soll /tmp/ordner/datei.txt ueberschrieben werden? [j/n] " ans case "$ans" in
bei ja/j/yes/y
ja|j|yes|y)
wget http://datei.aus.dem./internet.txt > /tmp/ordner/datei.txt
wget -O /tmp/ordner/datei.txt http://datei.aus.dem./internet.txt ;; esac Wenn du bei wget die Datei auf stdout haben willst musst du das wget sagen! 'wget -O - $URL'.
ANSONSTEN
else
download überspringen und nächsten befehle ausführen.
# also nix fi Nochmal zusammen und etwas uebersichtlicher: ==== #!/bin/sh FILE="/tmp/ordner/datei.txt" URL="http://datei.aus.dem./internet.txt" if test -e "$FILE"; then read -p "Soll $FILE ueberschrieben werden? [j/n] " ans case "$ans" in ja|j|yes|y) wget -O "$FILE" "$URL" ;; esac fi # ... weitere Befehle ... ==== So, und jetzt gehst du erstmal hin, setzt dich auf den Hosenboden, liest "help read", "help case" bzw. generell "man bash" und selflinux, bis du erklaeren kannst, wie und warum das obige funktioniert. Nicht nur was es macht. Oder was du glaubst was es macht oder machen soll. Und schreib (formuliere und formatiere) in Zukunft bitte leserlich. Wenn du weiter so schreibst werde ich dir nicht mehr antworten, es ist mir einfach zu muehsam, dein Gewurschtel zu entziffern. -dnh -- Hinhören gehört zum Nachschauen, sonst hat man das Nachsehen. [Jakob Krieger in dag°]
Am Donnerstag, 17. August 2006 22:02 schrieb David Haller:
Nochmal zusammen und etwas uebersichtlicher:
==== #!/bin/sh
FILE="/tmp/ordner/datei.txt" URL="http://datei.aus.dem./internet.txt"
if test -e "$FILE"; then read -p "Soll $FILE ueberschrieben werden? [j/n] " ans case "$ans" in ja|j|yes|y) wget -O "$FILE" "$URL" ;; esac fi
# ... weitere Befehle ... ==== Da mir jemand anderes ein anderes beispiel geschrieben hat, hab ich mir das schon "zusammen gewurschtelt" deins sieht logischer aus . FILE und URL. Ok hab ich gepennt. bzw hab statt FILE cdx= genommen meins sieht jetzt so aus: [...] cd1=/tmp/isofiles/cd1.iso
if [ ! -e $cd1 ]; then wget http://ftp.join.uni-muenster.de/pub/linux/distributions/opensuse/distributio... $cd1 ; else { while : do echo "Soll die Datei $cd1 überschrieben werden ? Ja / Nein?" read line # read: Zeile von StdIn einlesen case "$line" in [j]|) echo "Die Datei $cd1 wird überschrieben!" wget http://ftp.join.uni-muenster.de/pub/linux/distributions/opensuse/distributio... $cd1 ; break;; [n) echo "Die Datei $cd1 bleib erhalten. Weiter gehts." sleep 1 break;; *) echo "Nur j oder n eingeben.";; esac done } fi [...] wenn ich beides vergleiche.... MAN ICH EIN MÜLL GESCHRIEBEN!!! aber so wie´s jetzt ist läufts huntert prozentig. von Verzeichnisse anlegen über Datensätze ändern mit sed und über mkisofs bis hin zum DVD brennen und alle Dateien wieder von der Festplatte löschen. *fg*
So, und jetzt gehst du erstmal hin, setzt dich auf den Hosenboden, liest "help read", "help case" bzw. generell "man bash" und selflinux, bis du erklaeren kannst, wie und warum das obige funktioniert. Nicht nur was es macht. Oder was du glaubst was es macht oder machen soll.
da ich gesehen habe, das man sich ne menge schreibarbeit ersparen kann werde ich mir das jetzt hinter die ohren schreiben und das morgen mal in angriff nehmen. bin ja echt mal gespannt wieviel ich da noch kützen kann.
Und schreib (formuliere und formatiere) in Zukunft bitte leserlich. Sorry... da ich nicht wusste ich ich das anders hätte erklären sollen hab ich das so geschrieben.
Gruß Maurice
Hallo, Am Don, 17 Aug 2006, Maurice Schmidt schrieb: [..]
meins sieht jetzt so aus: [...] cd1=/tmp/isofiles/cd1.iso
if [ ! -e $cd1 ]; then
Wenn du "$cd1" nicht quotest, d.h. nicht in Anführungszeichen schreibst, dann kannst du damit brutal auf die Fresse fliegen. Gewöhne es dir von Anfang an an, immer so streng zu quoten wie möglich (also möglichst mit '', sonst mit ""). Und um nicht zu quoten mußt du schon einen sehr guten Grund haben. Das gilt für weitere Verwendungen unten von $cd1 genauso.
wget http://ftp.join.uni-muenster.de/pub/linux/distributions/opensuse/distributio... $cd1 ;
Was soll das sein? => wget --help wget URL wget -O AUSGABE_DATEI URL So wie du es schreibst versucht wget zuerst das ISO und anschließend "$cd" ins aktuelle Verzeichnis runterzuladen... Und außerdem: So lange "Dinger" wie hier die URL sollte man, besonders wenn sie mehrfach auftauchen, in Variablen auslagern. In meinem Vorschlag war das die Variable "URL".
else { ^ Wozu?
while : do echo "Soll die Datei $cd1 überschrieben werden ? Ja / Nein?" read line # read: Zeile von StdIn einlesen
Das ist noch ok, den Prompt kann man selber ausgeben, aber ein 'echo -n' ist da besser. Bzw. eben gleich 'read -p'.
case "$line" in [j]|) echo "Die Datei $cd1 wird überschrieben!"
help case
wget http://ftp.join.uni-muenster.de/pub/linux/distributions/opensuse/distributio... $cd1 ;
s.o.
break;; [n) echo "Die Datei $cd1 bleib erhalten. Weiter gehts." sleep 1
^^^ das [n). So wird das nix. help case
break;; *) echo "Nur j oder n eingeben.";; esac done } fi
Na also, du hast das 'fi' gefunden ;)
[...] wenn ich beides vergleiche.... MAN ICH EIN MÜLL GESCHRIEBEN!!!
Aber die Formatierung ist schonmal deutlich verbessert. Aber nochwas: wenn du Dateien spiegeln willst, das kann wget auch selber, da mußt du kein Script schreiben. Der einzige Nachteil ist, daß du, wenn es sinnvoll sein soll, die Verzeichnisstruktur vom Server uebernehmen mußt. Aber da kann man immer noch Symlinks oder Hardlinks verwenden. Und dann kann man, wie ich z.B., auch direkt von Festplatte installieren, nur die erste CD muß man teilweise auspacken... Beispiel bzgl. wget / SUSE-ISOs: Versuch mal dies hier: ==== #!/bin/sh BASE="ftp://ftp.join.uni-muenster.de/pub/linux/distributions/opensuse/distribution" for i in `seq 1 5`; do echo "${BASE}/SL-10.2-Alpha2/iso/SUSE-Linux-10.2-Alpha2-i386-CD${i}.iso" done | wget -i - -nr -c -m ==== Bitte lese dir wegen der wget-Optionen 'info wget' durch! Was der Teil davor macht: kommentiere in der letzten Zeile das "| wget ..." aus und starte das script mit 'sh -x scriptname'.
So, und jetzt gehst du erstmal hin, setzt dich auf den Hosenboden, liest "help read", "help case" bzw. generell "man bash" und selflinux, bis du erklaeren kannst, wie und warum das obige funktioniert. Nicht nur was es macht. Oder was du glaubst was es macht oder machen soll.
da ich gesehen habe, das man sich ne menge schreibarbeit ersparen kann werde ich mir das jetzt hinter die ohren schreiben und das morgen mal in angriff nehmen. bin ja echt mal gespannt wieviel ich da noch kützen kann.
Wenn du jetzt noch dein "Großschreibtaste" wiederfindest...
Und schreib (formuliere und formatiere) in Zukunft bitte leserlich. Sorry... da ich nicht wusste ich ich das anders hätte erklären sollen hab ich das so geschrieben.
Naja, wenn du dich weiter so verbesserst (dein Script oben war von der Formatierung her schon mal ok), dann gibt's Hoffnung ;) -dnh -- "The only "intuitive" interface is the nipple. After that, it's all learned." -- Bruce Ediger on X interfaces.
Hallo David, Am Freitag 18 August 2006 01:25 schrieb David Haller:
Hallo, ...
manchmal machst Du einen auf 'Oberlehrer' und dann so was...
schreibst, dann kannst du damit brutal auf die Fresse fliegen. ...
Naja, wenn du dich weiter so verbesserst (dein Script oben war von der Formatierung her schon mal ok), dann gibt's Hoffnung ;) da hat Maurice ja noch mal Glück gehabt ... ;-)
-dnh
-- "The only "intuitive" interface is the nipple. After that, it's all learned." -- Bruce Ediger on X interfaces. Grüße -- MfG Rolf Masfelder EMail: rolf.masfelder@nector.de
Am Freitag, 18. August 2006 01:25 schrieb David Haller: Hallo David. Also... ich habe das Script (unter anderem so wie ich es geschrieben habe) fertig. Und es Funktioniert sogar ordentlich. Außerdem war das kein "Ersthaftes" Script in dem sinne. Ich wollte mich ein bisschen mit Bashscripten auseinander setzten und dann nach und nach so step by step weiter gehen. Das Script Erstellt mir aus allen ISO-Files die über wget runtergeladen werden eine Installations-DVD Vom erstellen des DVD Verzeichnisses bis hin zur DVD brennen und alle Runtergeladenen und erstellten Datei wieder zu löschen. Selbst die dvd.iso Datei kann auf Wunsch des Benutzers wieder gelöscht werden. Und dafür das dies mein aller erstes Script ist, finde ich persönlich das schon Klasse. Für Profis unter euch mag das lächerlich sein. Aber für mich ist es schon ein GOßER Schritt in die (fast) richtige Richtung. Daher bin ich auch für die Verbesserungsvorschläge sehr dankbar. Aber ich hab´s ja jetzt soweit hin bekommen. Jetzt werde ich die Verbesserungen vornehmen und dannach werde ich mich mit der Theorie mehr beschäftigen. Ich denke mal die Form Sache hat sich jetzt auch erledigt. Hab ja dieses mal aufgepasst. ;-) @Rolf Masfelder David hatte schon irgendwie Recht. Und ich sehe hier auch niemenden als "Oberlehrer". Es waren lediglich gut gemeinte Ratschläge die ich beherzigen sollte. ;-) Von daher denke ich ist die Frage tiefgehend genug beantwortet worden und ich schreib im Betreff GELÖST rein ;-) Viel Dank nochmal euch allen. Gruß Maurice
participants (7)
-
Achim Schäfer
-
Andre Tann
-
David Haller
-
Martin Schröder
-
Maurice Schmidt
-
Raffael Schmid
-
Rolf Masfelder