web-dev-qa-db-fra.com

vérification de la valeur de retour de wget [if]

J'écris un script pour télécharger un tas de fichiers et je veux qu'il informe quand un fichier particulier n'existe pas.

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

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

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

Qu'est-ce qui ne va pas?

30
Igor

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

36
Andrew Medico

D'autres ont correctement posté que vous pouvez utiliser $? pour obtenir le code de sortie le plus récent:

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

Cela vous permet de capturer à la fois le stdout et le code de sortie. Si ce que vous imprimez ne vous intéresse pas, vous pouvez simplement le tester directement:

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

Et si vous voulez supprimer la sortie:

if wget -q "$URL" > /dev/null; then
    ...
58
Cascabel

$r est vide et votre condition devient donc if [ -ne 0 ]. Il semble que -ne soit utilisé comme opérateur unaire. Essayez ceci à la place:

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

EDITComme Andrew l'a expliqué avant moi, les backticks retournent la sortie standard, alors que $? renvoie le code de sortie de la dernière opération.

12
Bolo

tu pourrais juste

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

-(~)----------------------------------------------------------(07:30 Tue Apr 27)
risk@DockMaster [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)
risk@DockMaster [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)
risk@DockMaster [2026] --> 
9
kSiR

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 récupérer le code de retour avec $ ?.

Une solution consiste à gérer la propriété "--server-response", en recherchant le code d'état http 200 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

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

1
kazzikazzi

Meilleure façon de capturer le résultat de wget et de vérifier l'état de l'appel

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

De cette façon, vous pouvez vérifier le statut de wget et stocker les données de sortie.

  1. Si l'appel réussit, utilisez la sortie enregistrée

  2. Sinon, l'erreur se termine avec l'erreur wget

0
Anshul Sharma