2010-04-26 12 views
27

Ich schreibe ein Skript eine Reihe von Dateien herunterladen, und ich möchte es informieren, wenn eine bestimmte Datei nicht existiert.Überprüfung wget Rückgabewert [if]

r=`wget -q www.someurl.com` 
if [ $r -ne 0 ] 
    then echo "Not there" 
    else echo "OK" 
fi 

Aber es gibt die folgenden Fehler bei der Ausführung:

./file: line 2: [: -ne: unary operator expected

Was ist los?

Antwort

34

$r ist die Textausgabe von wget (die Sie mit Backticks aufgenommen haben). Verwenden Sie die Variable $?, um auf den Rückgabecode zuzugreifen.

+0

Dies ist die richtige Methode. – kSiR

+1

Während dies richtig ist, wäre eine bessere Erklärung, warum '$ r' leer ist und warum die Fehlermeldung auftritt. – Brian

10

$r ist leer, und daher wird Ihr Zustand if [ -ne 0 ] und es scheint, als ob -ne als unärer Operator verwendet wird. Versuchen Sie stattdessen:

wget -q www.someurl.com 
if [ $? -ne 0 ] 
    ... 

EDIT Wie Andrew vor mir erklärt, kehren Backticks Standardausgabe, während $? den Exit-Code der letzten Operation zurück.

+2

Dies ist die einzige Antwort, die erklärt, warum der Fragesteller diese Fehlermeldung erhält. +1. – lesmana

53

Andere haben richtig geschrieben, dass Sie $? bekommen die aktuellste Exit-Code verwenden können:

wget_output=$(wget -q "$URL") 
if [ $? -ne 0 ]; then 
    ... 

Sie die stdout und den Exit-Code beide erfassen Auf diese Weise können. Wenn Sie nicht eigentlich egal, was es druckt, können Sie es einfach direkt testen:

if wget -q "$URL"; then 
    ... 

Und wenn Sie möchten, um die Ausgabe zu unterdrücken:

if wget -q "$URL" > /dev/null; then 
    ... 
+4

Danke für die Abrundung der angenommenen Antwort. – colgur

+0

Ist es Standard, dass "if" den Exit-Code des Programms erhält, wenn dieses Formular verwendet wird? ('if ; dann ...') – Vassilis

9

Sie konnte nur

wget ruffingthewitness.com && echo "WE GOT IT" || echo "Failure" 

-(~)----------------------------------------------------------(07:30 Tue Apr 27) 
[email protected] [2024] --> wget ruffingthewitness.com && echo "WE GOT IT" || echo "Failure" 
--2010-04-27 07:30:56-- http://ruffingthewitness.com/ 
Resolving ruffingthewitness.com... 69.56.251.239 
Connecting to ruffingthewitness.com|69.56.251.239|:80... connected. 
HTTP request sent, awaiting response... 200 OK 
Length: unspecified [text/html] 
Saving to: `index.html.1' 

    [ <=>                     ] 14,252  72.7K/s in 0.2s  

2010-04-27 07:30:58 (72.7 KB/s) - `index.html.1' saved [14252] 

WE GOT IT 
-(~)-----------------------------------------------------------------------------------------------------------(07:30 Tue Apr 27) 
[email protected] [2025] --> wget ruffingthewitness.biz && echo "WE GOT IT" || echo "Failure" 
--2010-04-27 07:31:05-- http://ruffingthewitness.biz/ 
Resolving ruffingthewitness.biz... failed: Name or service not known. 
wget: unable to resolve host address `ruffingthewitness.biz' 
zsh: exit 1  wget ruffingthewitness.biz 
Failure 
-(~)-----------------------------------------------------------------------------------------------------------(07:31 Tue Apr 27) 
[email protected] [2026] --> 
+0

Sehr schlau! Ich schlage vor, '-q' für keine Befehlszeilenantwort hinzuzufügen ... – insign

1

Ich habe alle Lösungen ohne Glück versucht.

wget führt in nicht-interaktive Art und Weise. Das bedeutet, dass wget im Hintergrund arbeitet und Sie den de Return-Code nicht mit $? Fangen können.

Eine Lösung ist es, die „--server-response“ Eigenschaft zu handhaben, http Statuscode 200 Beispiel der Suche:

wget --server-response -q -o wgetOut http://www.someurl.com 
sleep 5 
_wgetHttpCode=`cat wgetOut | gawk '/HTTP/{ print $2 }'` 
if [ "$_wgetHttpCode" != "200" ]; then 
    echo "[Error] `cat wgetOut`" 
fi 

Hinweis: wget einige Zeit brauchen, seine Arbeit zu beenden, aus diesem Grunde Ich habe "Schlaf 5". Dies ist nicht der beste Weg, aber funktionierte gut, um die Lösung zu testen.

0

Der beste Weg, um das Ergebnis von wget zu erfassen und prüfen auch den Anrufstatus

wget -O filename URL 
if [[ $? -ne 0 ]]; then 
    echo "wget failed" 
    exit 1; 
fi 

diese Weise können Sie den Status von wget überprüfen sowie speichern die Ausgangsdaten.

  1. Wenn Anruf erfolgreicher Einsatz der Ausgang

    gespeichert
  2. Sonst wird es mit dem Fehler wget verlassen fehlgeschlagen