2010-04-26 6 views
27

J'écris un script pour télécharger un tas de fichiers, et je veux qu'il informe lorsqu'un fichier particulier n'existe pas.Vérification de la valeur de retour de wget [if]

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

Mais il donne l'erreur suivante lors de l'exécution:

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

Qu'est-ce qui ne va pas?

Répondre

34

$r est la sortie de texte de wget (que vous avez capturée avec des guillemets). Pour accéder au code de retour, utilisez la variable $?.

+0

Ceci est la méthode appropriée. – kSiR

+1

Bien que ce soit correct, une meilleure explication serait pourquoi '$ r' est vide et pourquoi le message d'erreur se produit. – Brian

10

$r est vide, et donc votre condition devient if [ -ne 0 ] et il semble que -ne est utilisé comme opérateur unaire. Essayez ceci:

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

EDIT Comme Andrew a expliqué devant moi, retourner la sortie standard des accents graves, alors que $? renvoie le code de sortie de la dernière opération.

+2

C'est la seule réponse qui explique pourquoi le demandeur reçoit ce message d'erreur. +1 – lesmana

53

D'autres ont correctement affiché que vous pouvez utiliser $? pour obtenir le dernier code de sortie:

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

Cela vous permet de saisir à la fois la sortie standard et le code de sortie. Si vous ne vous souciez pas vraiment ce qu'il imprime, vous pouvez tester directement:

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

Et si vous voulez supprimer la sortie:

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

Merci d'avoir complété la réponse acceptée. – colgur

+0

Est-il normal que 'if' obtienne le code de sortie du programme lorsque ce formulaire est utilisé? ('si , alors ...') – Vassilis

9

vous pourriez juste

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

Très intelligent! Je suggère d'ajouter '-q' pour aucune réponse en ligne de commande ... – insign

1

J'ai essayé toutes les solutions sans chance.

wget s'exécute de manière non interactive. Cela signifie que wget fonctionne en arrière-plan et que vous ne pouvez pas attraper le code de retour avec $ ?.

Une solution, il est de gérer la propriété "--server-réponse", à la recherche http 200 code d'état Exemple:

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 

Note: wget besoin de temps pour terminer son travail, pour cette raison que je mets "Dormez 5". Ce n'est pas la meilleure façon de faire, mais cela a bien fonctionné pour tester la solution.

0

La meilleure façon de saisir le résultat de wget et aussi vérifier l'état d'appel

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

Cette façon, vous pouvez vérifier l'état de wget ainsi que stocker les données de sortie.

  1. Si l'appel est utilisé avec succès la sortie stockée

  2. Sinon, il sortira avec le wget d'erreur a échoué