2012-09-16 11 views
6

Ich habe ein einfaches Skript zu prüfen, ob die Homepage eine bestimmte Zeichenfolge enthält. Es sieht aus wie:Bash string (Befehlsausgabe) Gleichheitstest

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

Wie Sie sehen, ich bin auf der Suche „OK“ zu bekommen, aber bekam ein „Falsch“.

Was ist los damit?

Wenn ich if [$ res == "0"], es funktioniert. Wenn ich nur res = „0“ statt res = verwenden curl..., auch kann es die gewünschten Ergebnisse erzielen.

Warum gibt es diese Unterschiede?

Antwort

1

fand ich die Antwort in glenn jackman hilft.

ich die folgenden Punkte in dieser Frage:

  • wc -l ‚s Ausgabe Leerzeichen enthält.
  • Debugging mit echo "$var" statt echo $var
  • [[ bewahrt den wörtlichen Wert aller Zeichen innerhalb des var.
  • [ erweitert var auf ihre Werte vor der Ausführung, weil [ist eigentlich die test cmd, so folgt es Shell Expansions Regeln.
16

Man konnte sehen, was res enthält: echo "Wrong: res=>$res<"

Wenn Sie, wenn ein Text einen anderen Text enthält sehen wollen, müssen Sie nicht auf die Länge von grep Ausgabe aussehen müssen: Sie grep aussehen sollte Rückgabecode:

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 

Oder auch ohne 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

Dank, es ist gute Lösung. Aber, wie meine Frage, ich weiß nur wollen, warum [[$ res == „0“]] wird in diesem Fall nicht funktioniert, so dass ich vermeiden, die gleichen Fehler in der Zukunft zu machen – kliu

+1

was Sie sehen mit 'od -c <<< "$ res" '? Gibt es zusätzliche Leerzeichen? –

+0

Ja, Sie haben Recht, es gibt Whitespaces in wc ausgegeben. Vielen Dank. – kliu