2012-09-16 16 views
6

Mam prosty skrypt do sprawdzenia, czy strona zawiera określony ciąg znaków. Wygląda na to:Test basha (wynik polecenia) test równości

#!/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 

Jak widać, czekam na "OK", ale otrzymałem komunikat "Wrong".

Co jest nie tak z tym?

Jeśli użyję, jeśli [$ res == "0"], działa. Jeśli po prostu użyję res = "0" zamiast res = curl..., może on również uzyskać pożądane wyniki.

Dlaczego są te różnice?

Odpowiedz

1

Znalazłem odpowiedź w Pomoc glenn jackman.

otrzymuję następujące punkty w tej kwestii:

  • wc -l „s wyjściowy zawiera spacje.
  • debugowanie z echo "$var" zamiast echo $var
  • [[ chroni dosłowne wartości wszystkich znaków w obrębie var.
  • [ rozszerza się var do ich wartości przed wykonaniem, to dlatego, że [jest faktycznie test cmd, więc przestrzega reguł Shell Expansions.
16

Można zobaczyć, co res zawiera: echo "Wrong: res=>$res<"

Jeśli chcesz sprawdzić, czy jakiś tekst zawiera jakiś inny tekst, nie trzeba patrzeć na długości produkcji grep: należy spojrzeć na grepa Kod zwrotny:

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 

Albo nawet bez 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

Dzięki, to dobre rozwiązanie. Ale, jako moje pytanie, po prostu chcę wiedzieć, dlaczego [[res == "0"]] nie działa w tym przypadku, dzięki czemu mogę uniknąć popełniania tych samych błędów w przyszłości – kliu

+1

co widzisz z 'od -c <<< "$ res" '? Czy istnieją dodatkowe białe znaki? –

+0

Tak, masz rację, są tam białe spacje wyjściowe. Dzięki. – kliu