# kleines Shell-Skript



## flou (21. Februar 2005)

Hallo,

 wie kann ich mit nem Shell Skript am besten prüfen ob eine Datei "http://www.soundso.de/soundso.dat" vorhanden ist?

 Danke

 Flou


----------



## RedWing (21. Februar 2005)

Hallo,
schau mal da:

```
#! /bin/bash
FILETOPROOF=http://www.tutorials.de/forum.html

if wget $FILETOPROOF &> /dev/null
then
        echo "Bingo"
        rm -f $FILETOPROOF
else
        echo ":-("
fi
```

Gruß

RedWing


----------



## ocb (21. Februar 2005)

RedWing hat gesagt.:
			
		

> Hallo,
> schau mal da:
> 
> ```
> ...


         Test: FILETOPROOF=http://www.tutorials.de/breakmy.script
         Ergebnis: "Bingo"



         Versuchs mal so:

```
#! /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
```
 
 Das Skript prüft auf Redirect (302), Not Found (404) und falsche URLs (in der Ausgabe von wget taucht irgendwo 'failed' auf).

 302: das Objekt existiert nicht, der Server leitet wget aber auf eine Fehlerseite um und wget denkt, das wäre das angeforderte Objekt (was es aber nicht ist).

 404: das Objekt existiert nicht und der Server gibt 404 zurück

 failed: die URL gibts nicht


----------



## RedWing (21. Februar 2005)

ocb hat gesagt.:
			
		

> Test: FILETOPROOF=http://www.tutorials.de/breakmy.script
> Ergebnis: "Bingo"


Mhm wenn dus schon optimierst solltest du dein Script 
wenigstens auf Funktionalität testen:

```
xxx@xxx:~> ./test sdgversaerhg
found
```

Bin mal so frei und berichtige dein Script: 

```
#! /bin/bash
  urlex=`wget --spider $1 2>&1 | grep -c -E "302|404|failed"` 
  if [ $urlex -eq 0 ]
  then
        echo "not found"
  else
        echo "found"
  fi
```

Gruß

RedWing


----------



## ocb (21. Februar 2005)

Wenn Du mir jetzt noch sagen könntest, wo Du was berichtigt hast? Ich würde eher sagen, Du hast es kaputt gemacht.  Deine Version führt genau zu dem Verhalten, was Du in Deinem "Test" monierst. Meine Version sagt "not found" und irgendwie stimmt das ja auch, oder? 

 Ach ja..."optimiert" hab ich nix, nur ein Skript angegeben, das auch _funktioniert_.


----------



## RedWing (21. Februar 2005)

Augen auf bei Eierkauf:
if [ $urlex != 0 ]

Dein Skript tut so nicht funktionieren

Gruß

RedWing


----------



## ocb (21. Februar 2005)

Siehe oben... Sorry für's cross-editing.


----------



## RedWing (21. Februar 2005)

Also ich will es dir nochmal verdeutklichen:

Mein Skript:

```
#! /bin/bash 
FILETOPROOF=sdgversaerhg 
if wget $FILETOPROOF &> /dev/null 
then
        echo "Bingo" 
        rm -f $FILETOPROOF
else 
        echo ":-(" 
fi
```
Ausgabe:

```
xxx@taco31:~> ./test2 
:-(
```

Dein Script:

```
#! /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
```
Ausgabe:

```
xxx@taco31:~> ./test sdyrhg
found
```

So und jetzt nochmal gibt es die seite sdyrhg? ich glaube 
nicht oder?
Dein Script berichtigt:

```
#! /bin/bash
  urlex=`wget --spider $1 2>&1 | grep -c -E "302|404|failed"` 
  if [ $urlex -eq 0 ]
  then
        echo "not found"
  else
        echo "found"
  fi
```

Ausgabe:

```
xxx@taco31:~> ./test sdyrhg
not found
```
So ists die richtige Funktionaliät gelle?
Dann klappts nämlich auch mitem Nachbarrn

Gruß

RedWing


----------



## ocb (21. Februar 2005)

Ähm...wir reden schon von den Skripten, die hier in den Code-Blöcken stehen, oder?!


```
<geht dich="" nix="" an="" :=""> $ ./wtest 
  found
```
 
  Alright, den Fehler gebe ich zu. 


```
<geht dich="" nix="" an="" :=""> $ ./wtest sdyrhg
  not found
```
 
 Tja...also warum das bei Dir nicht so ist, weiß ich net. und eine logische Erklärung dafür erschließt sich mir ebenfalls nicht.


```
<geht dich="" nix="" an="" :=""> $ ./wtest_raven sdyrhg
  found
```
 
  Hmm...also warum bloß?

 $urlex hat den Wert 0, wenn grep in der Ausgabe von wget weder 302, 404 noch "failed" findet. Mit anderen Worten, wenn $urlex == 0 sind wir glücklich und haben was gefunden. Dein Skript sagt: Wenn $urlex == 0 haben wir nichts gefunden ($urlex -eq 0). Das ist die umgekehrte Logik und funktioniert nun mal nicht, da kannste Dich auf'n Kopp stelln. 
 $urlex hat einen Wert > 0, wenn wget irgendwas moniert (302,404,"failed") und deshalb mindestens eine Zeile von grep als match identifiziert wird. Deshalb gilt: wenn $urlex != 0 (oder von mir aus $urlex -neq 0) gibts 'n Fehler und wir sagen das auch...

 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...
 </geht></geht></geht>


----------



## RedWing (21. Februar 2005)

> $urlex hat einen Wert > 0, wenn wget irgendwas moniert (302,404,"failed") und deshalb mindestens eine Zeile von grep als match
> identifiziert wird. Deshalb gilt: wenn $urlex != 0 (oder von mir aus $urlex -neq 0) gibts 'n Fehler und wir sagen das auch...


Das klingt logisch is aber anscheinend nicht so oder ich bin
wirklich ein DAU:


```
xxx@taco31:~> echo `wget --spider http://foo.de/foo.html >&1 | grep -c -E "302|404|failed"` 
--14:21:41--  http://foo.de/foo.html
           => `foo.html'
Auflösen des Hostnamen »foo.de«.... fertig.
Verbindungsaufbau zu foo.de[212.227.4.54]:80... verbunden.
HTTP Anforderung gesendet, warte auf Antwort... 404 Not Found
14:21:41 FEHLER 404: Not Found.
0
```

Gruß

RedWing


----------



## ocb (21. Februar 2005)

RedWing hat gesagt.:
			
		

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


 
 Ich befürchte schon...  


```
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.


```
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.


----------



## RedWing (21. Februar 2005)

> 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:

```
#! /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:

```
xxx@taco31:~> ./test http://www.sdrgf.de/sdrgf.htm
found
```
2.) Ausgabe

```
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.


----------



## ocb (21. Februar 2005)

```
$ 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".


```
$ 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).


```
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).


```
#! /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>


----------



## RedWing (21. Februar 2005)

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:

```
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


----------



## ocb (21. Februar 2005)

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). 

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


```
#! /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>


----------

