2010-04-26 17 views
27

Estoy escribiendo un script para descargar un grupo de archivos, y quiero que informe cuando un archivo en particular no existe.comprobando el valor de retorno de wget [if]

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

Pero da el siguiente error en la ejecución:

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

¿Qué ocurre?

Respuesta

34

$r es la salida de texto de wget (que ha capturado con marcadores). Para acceder al código de retorno, use la variable $?.

+0

Este es el método adecuado. – kSiR

+1

Si bien esto es correcto, una mejor explicación sería por qué '$ r' está en blanco y por qué aparece el mensaje de error. – Brian

10

$r está vacío, y por lo tanto su condición se convierte en if [ -ne 0 ] y parece como si -ne se utiliza como unario operador. Tal vez puedas probar:

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

EDITAR Como Andrew explicó antes que yo, acentos abiertos retorno a la salida estándar, mientras que $? devuelve el código de salida de la última operación.

+2

esta es la única respuesta que explica por qué el asker recibe ese mensaje de error. +1. – lesmana

53

Otros han publicado correctamente que puede utilizar $? para obtener el código de salida más reciente:

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

Esto le permite capturar tanto la salida estándar y el código de salida. Si en realidad no importa lo que se imprime, sólo puede probar directamente:

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

Y si se quiere suprimir la salida:

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

Gracias por redondear la respuesta aceptada. – colgur

+0

¿Es estándar que 'si' obtendrá el código de salida del programa cuando se utiliza este formulario? ('if ; then ...') – Vassilis

9

Se podía

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

¡Muy listo! Sugiero agregar '-q' para ninguna respuesta de línea de comando ... – insign

1

He estado probando todas las soluciones sin suerte.

wget se ejecuta de forma no interactiva. Esto significa que wget funciona en segundo plano y no puedes capturar el código de retorno con $ ?.

Una solución es para manejar la propiedad "--server-respuesta", buscando el código de estado HTTP 200 Ejemplo:

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 necesitan un tiempo para terminar su trabajo, por eso puse "dormir 5". Esta no es la mejor manera de hacerlo, pero funcionó bien para probar la solución.

0

mejor manera de capturar el resultado de wget y también comprobar el estado de la llamada

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

esta manera se puede comprobar el estado de wget, así como almacenar los datos de salida.

  1. Si la llamada se uso con éxito la salida almacenada

  2. De lo contrario, terminará con el wget Error No se pudo

Cuestiones relacionadas