2010-11-07 3 views
7

Je veux créer un fichier bash (.sh) qui effectue les opérations suivantes:wget avec sortie bash errorlevel

J'appelle le script comme ./download.sh www.blabla.com/bla.jpg

le script doit faire écho puis si le fichier a été téléchargé ou non ...

Comment est-ce que je peux faire ceci? Je sais que je peux utiliser errorlevel mais je suis nouveau à linux donc ...

Merci d'avance!

Répondre

6

Généralement, les applications sous Linux définissent la valeur de la variable d'environnement $? en cas d'échec Vous pouvez examiner ce code retour et voir si cela vous donne une erreur pour wget.

#!/bin/bash 
wget $1 2>/dev/null 
export RC=$? 
if [ "$RC" = "0" ]; then 
    echo $1 OK 
else 
    echo $1 FAILED 
fi 

Vous pouvez nommer ce script download.sh. Changez les autorisations à 755 avec chmod 755. Appelez-le avec le nom du fichier que vous souhaitez télécharger. ./download.sh www.google.com

+0

Ok .. pouvez-vous me donner un exemple, donc quand le fichier est téléchargé, le script fait écho "OK" sinon quelque chose comme "FAILED" ... – CyberK

+1

Changé le script pour avoir OK et FAILED en elle. Fait un meilleur exemple. – ojblass

+0

@CyberK: Vous pouvez aussi vouloir supprimer la sortie des wgets: 'wget $ 1 2>/dev/null' – thejh

3

Vous pouvez essayer quelque chose comme:

#!/bin/sh 

[ -n $1 ] || { 
    echo "Usage: $0 [url to file to get]" >&2 
    exit 1 
} 

wget $1 

[ $? ] && { 
    echo "Could not download $1" | mail -s "Uh Oh" [email protected] 
    echo "Aww snap ..." >&2 
    exit 1 
} 

# If we're here, it downloaded successfully, and will exit with a normal status 

Lorsque vous effectuez un script qui (probablement) être appelé par d'autres scripts, il est important de faire ce qui suit:

  • Assurez-sanity argument
  • Envoyer e-mail, écrire dans un journal, ou faire autre chose que quelqu'un sait ce qui a mal tourné

Le >&2 redirige simplement la sortie des messages d'erreur à stderror, qui permet à un script appelant à faire quelque chose comme ceci:

foo-downloader >/dev/null 2>/some/log/file.txt 

Comme il est une enveloppe courte, aucune raison d'abandonner un peu de bon sens :)

Cela vous permet également de diriger de manière sélective la sortie de wget à /dev/null, vous pourriez réellement vouloir le voir lors du test, surtout si vous recevez un e-mail en disant qu'il n'a pas :)

0

wget exécute en non-interactive façon. 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.