2010-04-26 11 views
27

Sto scrivendo uno script per scaricare un gruppo di file e voglio che informi quando un particolare file non esiste.verifica il valore di ritorno di wget [if]

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

Ma dà il seguente errore durante l'esecuzione:

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

Cosa c'è di sbagliato?

risposta

34

$r è l'output di testo di wget (che hai catturato con i backtick). Per accedere al codice di ritorno, utilizzare la variabile $?.

+0

Questo è il metodo corretto. – kSiR

+1

Mentre questo è corretto, una spiegazione migliore sarebbe perché '$ r' è vuoto e perché si verifica il messaggio di errore. – Brian

10

$r vuoto, e quindi le condizioni diventano if [ -ne 0 ] e sembra che -ne sia utilizzato come operatore unario. Prova a modificare:

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

EDIT Come Andrew ha spiegato prima di me, backticks tornano standard output, mentre $? restituisce il codice di uscita dell'ultima operazione.

+2

questa è l'unica risposta che spiega perché il richiedente sta ricevendo quel messaggio di errore. +1. – lesmana

53

Altri hanno correttamente inviato che è possibile utilizzare $? per ottenere il codice di uscita più recente:

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

Questo consente di catturare sia lo stdout e il codice di uscita. Se in realtà non importa quanto la stampa, si può solo provare direttamente:

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

E se si vuole eliminare l'output:

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

Grazie per l'arrotondamento della risposta accettata. – colgur

+0

E 'normale che 'if' otterrà il codice di uscita del programma quando questo modulo viene usato? ('if ; then ...') – Vassilis

9

si poteva solo

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

Molto intelligente! Suggerisco di aggiungere '-q' per nessuna risposta da linea di comando ... – insign

1

Ho provato tutte le soluzioni senza fortuna.

wget viene eseguito in modo non interattivo. Ciò significa che wget funziona in background e non puoi prendere il codice di ritorno con $ ?.

Una soluzione è di gestire la proprietà "--server-risposta", la ricerca http 200 codice di stato Esempio:

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 

Nota: wget bisogno di tempo per finire il suo lavoro, per questo motivo ho messo "dormire 5". Questo non è il modo migliore per farlo, ma ha funzionato bene per testare la soluzione.

0

modo migliore per catturare il risultato da wget e anche controllare lo stato della chiamata

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

In questo modo è possibile verificare lo stato di wget, nonché memorizzare i dati in uscita.

  1. Se chiamata è uso con successo l'output memorizzato

  2. In caso contrario si uscirà con il wget errore fallito

Problemi correlati