2012-09-16 16 views
6

Tengo un script simple para comprobar si la página web contiene una cadena especificada. Parece que:Prueba de igualdad de string de Bash (resultado de comando)

#!/bin/bash 
res=`curl -s "http://www.google.com" | grep "foo bar foo bar" | wc -l` 
if [[ $res == "0" ]]; then 
    echo "OK" 
else 
    echo "Wrong" 
fi 

Como se puede ver, yo estoy mirando para conseguir "OK", pero nos dieron una "incorrecto".

¿Qué tiene de malo?

Si uso if [$ res == "0"], funciona. Si solo uso res = "0" en lugar de res = curl..., también puede obtener los resultados deseados.

¿Por qué existen estas diferencias?

Respuesta

1

que encontró la respuesta en glenn jackman's ayuda.

me sale el siguiente puntos en esta pregunta:

  • wc -l 's de salida contiene espacios en blanco.
  • Depuración con echo "$var" en lugar de echo $var
  • [[ preserva el valor literal de todos los caracteres dentro de la var.
  • [ expande var a sus valores antes de realizar, es porque [es en realidad el test cmd, por lo que sigue Shell Expansions reglas.
16

Se podía ver lo que res contiene: echo "Wrong: res=>$res<"

Si desea ver si algún texto contiene un texto diferente, usted no tiene que mirar a la longitud de salida de grep: usted debe mirar de grep código de retorno:

string="foo bar foo bar" 
if curl -s "http://www.google.com" | grep -q "$string"; then 
    echo "'$string' found" 
else 
    echo "'$string' not found" 
fi 

O incluso sin grep:

text=$(curl -s "$url") 
string="foo bar foo bar" 
if [[ $text == *"$string"* ]]; then 
    echo "'$string' found" 
else 
    echo "'$string' not found in text:" 
    echo "$text" 
fi 
+0

Gracias, es una buena solución. Pero, como mi pregunta, solo quiero saber por qué [[$ res == "0"]] no funciona en este caso, por lo que puedo evitar cometer los mismos errores en el futuro – kliu

+1

¿Qué ves con 'od -c <<< "$ res" '? ¿Hay caracteres adicionales en el espacio en blanco? –

+0

Sí, tienes razón, hay espacios en blanco en la salida del wc. Gracias. – kliu

Cuestiones relacionadas