podsau Geschrieben 10. März 2010 Geschrieben 10. März 2010 Hallo, ich hab folgendes Problem. ich will in einem skript mit "curl" http requests an einen server schicken. dazu hab ich mehrere dateien in denen meine parameter liegen die in den requests mitgeschickt werden sollen. diese übergebe ich an curl und schicke das ganze ab. wenn alle requests erfolgreich waren sollen alle dateien in den unterordner backup verschoben werden. - for i in *.ref1; do echo $i dateiname="@${i}" curl -S --connect-timeout 4 -d $dateiname "http://XXX.XXX.XXX.XXX:XXXX/XX/XXX.aspx" if [ $? = 0 ] then echo "0" mv $i backup/ else echo "ERROR" fi done das klappt soweit ganz gut. nun hänge ich aber bei der fehlerbehandlung. mit " if [ $? = 0 ]" kann ich prüfen ob der timeout den ich festgelegt hab zuschlägt. es also eine verbindung zum server aufgebaut werden konnte. bei den parametern die ich mitsende handelt es sich z.b um einen hash der wiederum beim webserver gegengeprüft wird. stimmt der nicht liefert dieser mir einen error zurück Ausgabe auf der Konsole: ERROR:ChecksumInvalid <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DT D/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head><title> jetzt dachte ich mir pack ich den curl aufruf in eine if-abfrage und häng hinten dran ein grep welches auf "ERROR" prüft im stil von if [ curl -S --connect-timeout 4 -d $dateiname "http://XXX.XXX.XXX.XXX:XXXX/XX/XXX.aspx" | grep "ERROR" = true ] then ... ich weis nun nicht so recht wie die korrekte syntax für so eine abfrage aussehen könnte (ich hab schon mehrere probiert aber immer ohne erfolg), ob das so überhaupt möglich ist oder es vielleicht eine viel bessere lösung gibt ? vielen dank schon mal im vorraus !!! Zitieren
AnDi_P Geschrieben 10. März 2010 Geschrieben 10. März 2010 Hallo, if [ curl -S --connect-timeout 4 -d $dateiname "http://XXX.XXX.XXX.XXX:XXXX/XX/XXX.aspx" | grep "ERROR" = true ] Ich würde es mal so probieren: if [ `curl -S --connect-timeout 4 -d $dateiname "http://XXX.XXX.XXX.XXX:XXXX/XX/XXX.aspx" | grep -q "ERROR"` = 0 ] Hinzugekommen sind die Backticks "`" vor und nach dem Kommando, sowie der Parameter "-q" bei dem grep. Dadurch liefert das grep einen Rückgabewert, je nach dem ob der Suchbegriff gefunden wurde, oder nicht. Also quasi das, was du mit dem "true" abbilden wolltest. LG Zitieren
AnDi_P Geschrieben 11. März 2010 Geschrieben 11. März 2010 Habe es gerade mal mit einem anderen Beispiel getestet, scheint wohl so nicht zu funktionieren. Ich mache es meistens so: curl -S --connect-timeout 4 -d $dateiname "http://XXX.XXX.XXX.XXX:XXXX/XX/XXX.aspx" | grep -q "ERROR" if [ ${?} -eq 0 ] then .... fi Also im Prinzip das Gleiche wie vorher... MfG AnDi_P Zitieren
podsau Geschrieben 11. März 2010 Autor Geschrieben 11. März 2010 hallo AnDi_P, deine 2. Variante klappt genau so wie ich mir das gewünscht hab. was ich noch nich so ganz verstehe is warum: curl -S --connect-timeout 4 -d $dateiname "http://XXX.XXX.XXX.XXX:XXXX/XX/XXX.aspx" | grep -q "ERROR" eine 0 zurück liefert wenn er ein "ERROR" findet und eine 1 wenn keins vorhanden ist. müsste das nich genau umgedreht sein? trotzdem erstma vielen dank !!! Zitieren
AnDi_P Geschrieben 11. März 2010 Geschrieben 11. März 2010 Hallo, im Allgemeinen ist es so Linux festgelegt, dass ein Rückgabewert = 0 immer erfolgreich bedeutet. Alles != 0 deuted auf einen Fehler hin. Wieso, weshalb, warum? Weiß ich nicht - vielleicht sieht's schöner aus Hier noch mal was zum Lesen dazu: http://openbook.galileocomputing.de/linux/linux_07_shellskript_programmierung_009.htm#mjf5c6e0943531b66a4e40be08312c572c MfG Andi_P Zitieren
podsau Geschrieben 11. März 2010 Autor Geschrieben 11. März 2010 ok, gut zu wissen und danke für den link Zitieren
carmann Geschrieben 11. März 2010 Geschrieben 11. März 2010 Hi Leute, also in der man page zu grep welche ich einfach mal auf einem unserer SLES 10 Server geöffnet habe, steht folgendes unter der Beschreibung des Parameters "-q" für den grep Befehl: -q, --quiet, --silent Quiet; do not write anything to standard output. Exit immediately with zero status if any match is found, even if an error was detected. Also see the -s or --no-messages option. So wie es beschrieben ist, gibt das grep immer eine NULL zurück. Selbst bei einem Fehler, sofern diese Option genutzt wird. Eine NULL gibt's auch zurück wenn er keinen Sucherfolg hatte. Gruß, -Carmann- Zitieren
AnDi_P Geschrieben 11. März 2010 Geschrieben 11. März 2010 Hallo, stimmt, haste Recht, dass das da in der man-page steht Ich hab's gerade aber nochmal explizit nachgetestet, und benutze es bei vielen Scripten, und bei mir gibt "grep -q <Suchbegriff>" immer eine 0 wenn gefunden, und eine 1, wenn nicht. Vielleicht ein Fehler in der man-page? MfG Zitieren
podsau Geschrieben 12. März 2010 Autor Geschrieben 12. März 2010 Huhu, kann dem AnDi_P da nur zustimmen bei mir gehts genau so... mfg Zitieren
TheFinn Geschrieben 12. März 2010 Geschrieben 12. März 2010 So wie es beschrieben ist, gibt das grep immer eine NULL zurück. Selbst bei einem Fehler, sofern diese Option genutzt wird. Eine NULL gibt's auch zurück wenn er keinen Sucherfolg hatte. Äh, nein, so wie es beschrieben ist, gibt das grep immer eine Null zurück, wenn die Eingabe auf das Suchmuster passt, selbst, wenn dabei Fehler aufgetreten sind. Sorry für die Klugsch... Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.