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?
$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 $?
.
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
...
$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.
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] -->
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.
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.
Si l'appel réussit, utilisez la sortie enregistrée
Sinon, l'erreur se termine avec l'erreur wget