kleines Shell-Skript

RedWing hat gesagt.:
Das klingt logisch is aber anscheinend nicht so oder ich bin
wirklich ein DAU:
RedWing

Ich befürchte schon... :D

Code:
   skreyer@taco31:~> echo `wget --spider http://foo.de/foo.html >&1 | grep -c -E "302|404|failed"`

Mit >&1 leitest Du die Standardfehlerausgabe nicht in die Pipe. Deshalb sieht grep von den Fehlermeldungen nichts und matched logischerweise net.

Code:
   skreyer@taco31:~> echo `wget --spider http://foo.de/foo.html 2>&1 | grep -c -E "302|404|failed"`

Das ergibt, ebenso wie die entsprechende Zeile in meinem Skript, 2.
 
Mit >&1 leitest Du die Standardfehlerausgabe nicht in die Pipe. Deshalb sieht grep von den Fehlermeldungen nichts und matched logischerweise net.
Habs grad gesehen, sorry.
Summary: Mein Skript hat 'n Problem mit DAUs (wegen der falschen Ausgabe bei keinem Argument...Du bist nicht gemeint), aber nicht mit der Funktionalität. . Dein Skript funktioniert manchmal, aber nicht immer...
Aber dein Script tut bei mir immer noch nicht funktionieren.
Naja egal.
Vielleicht kannst du mir nochmal erklären was dran falsch is bzw was an meiner
Anwendung falsch ist:
test:
Code:
  #! /bin/bash
  urlex=`wget --spider $1 2>&1 | grep -c -E "302|404|failed"`
  if [ $urlex != 0 ]
  then
        echo "not found"
  else
        echo "found"
  fi
1. Ausgabe:
Code:
xxx@taco31:~> ./test http://www.sdrgf.de/sdrgf.htm
found
2.) Ausgabe
Code:
xxx@taco31:~> ./test http://www.foo.de/foo.html
not found

Danke und Gruß

RedWing

P.S. Fazit:
Ich denke mein, wie dein Skript funktionieren nicht immer
100 % ig. Sondern nur wenn unter angegebener URL ein Server
läuft der den Error Code 302/ 404 verschicken kann.
 
Zuletzt bearbeitet:
Code:
  $ wget --spider http://www.sdrgf.de/sdrgf.htm
  --14:53:46--  http://www.sdrgf.de/sdrgf.htm
             => `sdrgf.htm'
  Resolving www.sdrgf.de... failed: Name or service not known.

Da ist 'n "failed", also gibt grep 1 zurück und das Skript sagt "not found".

Code:
  $ wget --spider http://www.foo.de/foo.html
  --14:55:29--  http://www.foo.de/foo.html
             => `foo.html'
  Resolving www.foo.de... 212.227.4.54
  Connecting to www.foo.de[212.227.4.54]:80... connected.
  HTTP request sent, awaiting response... 404 
  14:55:30 ERROR 404: (no description).

Da ist 'n 404 drin, selbes Ergebnis wie oben.

Bei mir kommt in beiden Fällen das richtige Ergebnis raus. Die Logik im Skript ist auf jeden Fall korrekt (soweit es die betrachteten Fälle angeht, Sonderfälle - also irgendwelche anderen HTTP responses usw. - ausgenommen). Eventuell unterscheiden sich unsere bash bzw. grep Versionen bzw. Dein grep kann keine Perl-konformen regulären Ausdrücke (dann müßte es allerdings meckern).

Code:
   bash --version
  GNU bash, version 2.05b.0(1)-release (i686-pc-linux-gnu)
  
   grep --version
  grep (GNU grep) 2.5.1

Ansonsten sehe ich keine Erklärung für das Verhalten. Damit der Kollege Threaderöffner nicht komplett konfusioniert wird und Du eventuell nochmal 'n Test machen kannst, hier nochmal das komplette Skript (DAU-sicher, getestet mit allen Testfällen, die wir hier besprochen haben).

Code:
  #! /bin/bash
  
  if [ -z "$1" ];
  then
  	echo "usage: wtest <URL><url>"
  	exit 1
  fi		
  
  urlex=`wget --spider $1 2>&1 | grep -c -E "302|404|failed"`
  
  if [ $urlex != 0 ];
  then
  	echo "not found"
  else
  	echo "found"
  fi
</url>
 
Zuletzt bearbeitet:
Hallo ich nochmal:)
Ich weiß woran es liegt,

ich denke mal das wget bei dir ne englische Ausgabe
produziert. Meine Ausgabe von wget ist deutsch und da steht eben:
Code:
xxx@taco31:~> wget --spider http://www.sdfrg.de/sdfrg.html     
--15:19:56--  http://www.sdfrg.de/sdfrg.html
           => `sdfrg.html'
Auflösen des Hostnamen »www.sdfrg.de«.... fehlgeschlagen: Der Name oder der Dienst ist nicht bekannt.

Also nichts von irgendeinem failed. Das is auch der Grund
warum grep nicht anschlägt. Deswegen is dein Skript wohl nur
ne suboptimale lösung ;)

Gruß

RedWing
 
Zuletzt bearbeitet:
RedWing hat gesagt.:
Hallo ich nochmal:)
Ich weiß woran es liegt,

ich denke mal das wget bei dir ne englische Ausgabe
produziert. Meine Ausgabe von wget ist deutsch und da steht eben:
LOL...man versteckt eben doch immer noch Dinge am besten dort, wo sie jeder sehen kann. :)
Also nichts von irgendeinem failed. Das is auch der Grund
warum grep nicht anschlägt. Deswegen is dein Skript wohl nur
ne suboptimale lösung ;)
Dafür funktioniert sie wenigstens (wenn auch sprachgebunden). :p

Also schön...machen wir mal 'ne internationale Version draus:

Code:
   #! /bin/bash
   
   if [ -z "$1" ];
   then
   	echo "usage: wtest <url>"
   	exit 1
   fi		
   
   urlex=`wget --spider $1 2>&1` 
   
   if [[ $? -ne 0 || "$urlex" = *302* || "$urlex" = *404* ]]
   then
</url>   	echo "not found"
 <url>else
 </url>   	echo "found"
 <url>   fi
</url>
 
Zuletzt bearbeitet:
Zurück